Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    43

    MouseListener con Jpanel e tooltip

    sto avendo un problema che non so come risolvere.. non mi viene niente in mente... fate questa prova:

    inserite un jpanel(A) nel frame ed all'interno di esso un altro jpanel(B) e poi nel frame un pulsantino.

    in A c'è un mouselistener che fà una stmapa al click.
    Alla pressione del pulsante viene settato un tooltip in B ... il problema ora dove stà???
    È che con il settaggio del tooltip il listener di A non ascolta più gli eventi del mousee...

    Come si risolve??? devo far funzionar sia il tooltip che l'evento del mouse di A... (senza il tooltip tutto funziona benissimo)

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    al max posta il tuo codice e si vede.
    Mi fa molto strano che il set del tooltip annulli gli effetti del mouse listener

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    43
    Originariamente inviato da valia
    al max posta il tuo codice e si vede.
    Mi fa molto strano che il set del tooltip annulli gli effetti del mouse listener
    il problema penso che sia che con il settaggio del tooltip viene aggiunto un listener sul pannello(MOUSEMOTIONLISTENER).

    comunque ecco il codice: (il metodo initCOmponents() è quello che genera automaticamente netbeans)
    codice:
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import javax.swing.JPanel;
    
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
    /*
     * NewJFrame1.java
     *
     * Created on 25-lug-2011, 16.46.06
     */
    /**
     *
     */
    public class NewJFrame1 extends javax.swing.JFrame {
    JPanel cv;
        /** Creates new form NewJFrame1 */
        public NewJFrame1() {
            initComponents();
            cv=new JPanel();
            cv.setSize(jPanel1.getSize());
            jPanel1.add(cv);
            cv.setBorder(BorderFactory.createLineBorder(Color.yellow));
            jPanel1.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            jPanel1.addMouseListener(new MouseAdapter() {
    
                @Override
                public void mouseClicked(MouseEvent e) {
                    System.out.println("ka");
                }
            });
            
        }
    
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {
    
            jButton1 = new javax.swing.JButton();
            jPanel1 = new javax.swing.JPanel();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    
            jButton1.setText("jButton1");
            jButton1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton1ActionPerformed(evt);
                }
            });
    
            javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
            jPanel1.setLayout(jPanel1Layout);
            jPanel1Layout.setHorizontalGroup(
                jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGap(0, 100, Short.MAX_VALUE)
            );
            jPanel1Layout.setVerticalGroup(
                jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGap(0, 100, Short.MAX_VALUE)
            );
    
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(288, Short.MAX_VALUE))
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(0, 167, Short.MAX_VALUE)
                        .addComponent(jButton1)
                        .addGap(0, 167, Short.MAX_VALUE)))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(71, 71, 71)
                    .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(129, Short.MAX_VALUE))
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(0, 135, Short.MAX_VALUE)
                        .addComponent(jButton1)
                        .addGap(0, 136, Short.MAX_VALUE)))
            );
    
            pack();
        }// </editor-fold>                        
    
        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            cv.setToolTipText("ciao");
        }                                        
    
        /**
         * @param args the command line arguments
         */
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
    
                public void run() {
                    new NewJFrame1().setVisible(true);
                }
            });
        }
        // Variables declaration - do not modify                     
        private javax.swing.JButton jButton1;
        private javax.swing.JPanel jPanel1;
        // End of variables declaration                   
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ripeto non vedo come un tooltip litighi con il mouse listener e non ho nemmeno capito il tuo problema.
    Dal tuo codice vedo:

    1. pannello a cui setti un mouse listener
    2. bottone a cui setti un'azione

    mi chiedo: sei sicuro che servano tutti e due? e sei sicuro dell'azione e di cosa fai col tooltip??

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    43
    il codice postato non è altro che un frame con un pannello che ne contiene a sua volta un altro ed un pulsante... niente di eclatante ma è giusto un esempio.

    il problema non è altro che settando il tooltip al pannello CONTENUTO .. l'ascoltatore del pannelloche CONTIENE non cattura l'evento del mouse.

    con quel codice fai la prova :
    1. clikkasul pannello CONTENUTO el'ascoltatoredell'altro pannello cattura l'event(lo si verifica che fà una stampa)
    2. premi sul pulsante che setta il tooltip sul pannello CONTENUTO .
    3. ed ora prova a fare il tentativo n°1 e vedrai che l'ascoltatore non cattura più l'evento


    il problema è semplice.


    mi chiedo: sei sicuro che servano tutti e due? e sei sicuro dell'azione e di cosa fai col tooltip??
    che c'è di strano nel settare un tooltip ed avere alo stesso tempo un ascoltatore??
    l'azione che faccio è molto semplice il codice l'ho anche postato..

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Il problema non è ciò che accade DOPO, ma quello che accade prima. Non credo sia una vera "anomalia", ma il comportamento "anomalo" è quello iniziale: non dovrebbe MAI intervenire il mouseListener del contenitore, cliccando sul contenuto.

    Infatti, dopo aver cliccato sul pulsante, il mouseListener è ancora presente ma viene invocato solo se provi a cliccare sul bordo nero del pannello "contenitore".

    Mi dovrò documentare più approfonditamente, ma credo che accada questo: se nel pannello "contenuto" non è registrato alcun listener, tutti gli eventi vengono spediti in cascata sui vari contenitori. Quindi, inizialmente, il pannello col bordo giallo non ha alcun listener registrato e tutti i clic vengono spediti al contenitore (pannello con bordo nero). Dal momento in cui aggiungi un ToolTip, sul pannello viene registrato un listener. Da quel momento in avanti, gli eventi non vengono più spediti al contenitore, ma consumati dal listener.

    PS: evita come la peste di usare gli IDE per farti auto-generare il codice delle interfacce grafice... il codice che hai postato è una schifezza immonda. Per di più manca completamente un ordine con cui compaiono i componenti: quelli che hai lasciato posizionare a NetBeans vengono dichiarati alla fine della classe, quelli che hai aggiunto tu si trovano all'inizio. E' il caos. Per non parlare del fatto che se avessi scritto a mano l'interfaccia avresti usato metà del codice che hai postato.
    Ma queste sono considerazioni mie...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Credo di aver azzeccato il punto.

    Inizialmente il pannello "contenuto" non ha alcun MouseListener registrato. Quindi, tutti gli eventi vengono spediti al suo contenitore. Nel momento in cui viene aggiunto il ToolTip, su quel componente viene registrato un listener (ToolTipManager, che estende MouseAdapter), quindi viene registrato proprio un MouseListener, il quale NON ridefinisce il metodo mouseClicked() che rimane quello di default di MouseAdapter, cioè un metodo vuoto.

    Rispondo, quindi, alla domanda iniziale: come si risolve? Facile: registrando il MouseListener del pannello contenitore, ANCHE nel pannello contenuto. Chiaramente, non sarà più sufficiente una classe anonima come hai fatto (o meglio, non ha senso perchè dovresti registrarne due per fare la stessa cosa). Dovrai creare una classe separata, da istanziare e registrare su entrambi i pannelli.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    43
    Originariamente inviato da LeleFT
    Credo di aver azzeccato il punto.

    Inizialmente il pannello "contenuto" non ha alcun MouseListener registrato. Quindi, tutti gli eventi vengono spediti al suo contenitore. Nel momento in cui viene aggiunto il ToolTip, su quel componente viene registrato un listener (ToolTipManager, che estende MouseAdapter), quindi viene registrato proprio un MouseListener, il quale NON ridefinisce il metodo mouseClicked() che rimane quello di default di MouseAdapter, cioè un metodo vuoto.
    esatto setta proprio un mousemotionlistener che "annulla" il listener del pannello che contiene

    Originariamente inviato da LeleFT
    Rispondo, quindi, alla domanda iniziale: come si risolve? Facile: registrando il MouseListener del pannello contenitore, ANCHE nel pannello contenuto. Chiaramente, non sarà più sufficiente una classe anonima come hai fatto (o meglio, non ha senso perchè dovresti registrarne due per fare la stessa cosa). Dovrai creare una classe separata, da istanziare e registrare su entrambi i pannelli.

    Ciao.
    questa è l'unica soluzione?? mi è un pò scomoda perchè nell'applicazione vera e propria ci sono tanti pannelli contenuto in un unnico grande pannello e il listener(implementato in una classe a parte) a seconda del punto in cui veniva clikkato capiva qual'era il pannello. Comunque ti ringrazio per la disponibilità
    se hai in mente qualche altra soluzione sono ben accetto ad ascoltarla

    Ciao


    PS: evita come la peste di usare gli IDE per farti auto-generare il codice delle interfacce grafice... il codice che hai postato è una schifezza immonda. Per di più manca completamente un ordine con cui compaiono i componenti: quelli che hai lasciato posizionare a NetBeans vengono dichiarati alla fine della classe, quelli che hai aggiunto tu si trovano all'inizio. E' il caos. Per non parlare del fatto che se avessi scritto a mano l'interfaccia avresti usato metà del codice che hai postato. Ma queste sono considerazioni mie...
    sisi non ci sono dubbi su questo netbeans ne scrive tante di schifezze anche se per 2 pannelli insignificanti.. ma l'ho fatto giusto per pigrizia xD... ciaooo

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    43
    anzii... mi è venuta un'idea di creare una classe che estende il listener del pannello che CONTIENE e ridefinir in qualche modo il listener che viene creato con il settaggio del tooltip e all'evento clicked chiamare la classe padre ovvero quella del contenitore...
    Dovrebbe andare così ora devo documentarmi per ridefinire il listener che viene aggiunto con il tooltip.. Graziee di nuovoo ciaoo!

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Flaka
    anzii... mi è venuta un'idea di creare una classe che estende il listener del pannello che CONTIENE e ridefinir in qualche modo il listener che viene creato con il settaggio del tooltip e all'evento clicked chiamare la classe padre ovvero quella del contenitore...
    Dovrebbe andare così ora devo documentarmi per ridefinire il listener che viene aggiunto con il tooltip.. Graziee di nuovoo ciaoo!
    Difficile che tu ci riesca... dovresti ridefinire la classe JComponent in modo che vada ad usare la tua nuova classe, quindi ridefinire la classe JPanel in modo che estenda questa tua nuova "JComponent".... insomma: no, non è quello il modo di procedere.

    Se hai N pannelli e vuoi gestire i controlli del mouse su tutti è chiaro che ciascuno dovrà avere il suo MouseListener.

    La cosa più semplice da fare è creare una classe che estende JPanel e che ridefinista il metodo setToolTipText() in modo che vada ad aggiungere automaticamente il tuo Listener.


    Ciao. ciauz:
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.