2009-08-19 15 views
9

Qualcuno può spiegarmi perché questo codice viene stampato sulla console quando si sposta il mouse sulla casella di controllo? Qual è l'evento "change" che si verifica?JCheckbox change listener riceve notifica del mouse sugli eventi

import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 


public class Test { 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     JCheckBox c = new JCheckBox("Print HELLO"); 
     c.addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent e) { 
       System.out.println("HELLO"); 
      } 
     }); 
     f.getContentPane().add(c); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
    } 

} 

NOTA: Non faccio uso di un listener di azione perché nel mio programma io voglio essere in grado di fare:

checkBox.setSelected(boolean) 

e avere il mio ascoltatore notificato, che non può essere fatto con un ascoltatore di azioni. Quindi c'è un modo per disabilitare questo evento "mouse over" o un altro modo in cui posso implementare il mio listener?

+0

Strano, pensavo che l'uso di "setSelected" avrebbe innescato il cambiamento degli ascoltatori. Devo pensare a qualcos'altro. – jeef3

+0

Se lo eseguo su Java 5 su Mac OSX non riesco a passare il mouse sugli eventi. – banjollity

+0

@ jeef3: setSelected Fa gli eventi di cambio trigger. Ecco perché lo sto usando. Il fatto è che gli eventi di cambiamento vengono attivati ​​anche da movimenti del mouse sopra :) –

risposta

28

Si ottengono eventi al passaggio del mouse mentre il focus guadagnato/perso rappresenta una modifica allo stato del componente.

Invece potresti usare un ItemListener che ti darà ItemEvents.

L'oggetto che implementa l'interfaccia ItemListener ottiene questo ItemEvent quando si verifica l'evento. All'ascoltatore vengono risparmiati i dettagli dell'elaborazione dei singoli movimenti del mouse e dei clic del mouse e può invece elaborare un evento "significativo" (semantico) come "elemento selezionato" o "elemento deselezionato".

È possibile aggiungerlo alla casella di controllo con il metodo addItemListener() nella classe AbstractButton. Basta sostituire addChangeListener con questo:

c.addItemListener(new ItemListener() { 

    public void itemStateChanged(ItemEvent e) { 
     System.err.println(e.getStateChange()); 
    } 
}); 
+0

Grazie a questo funziona. Ho sempre pensato che gli ascoltatori di articoli si fossero limitati a elencare solo componenti. :) –

+1

Nessun problema. In realtà è ListSelectionListener che viene utilizzato per gli elenchi. Esiste un'interfaccia diversa per elenchi e pulsanti perché le selezioni di elenchi devono supportare la selezione di un intervallo di celle che richiede un tipo di evento diverso. – Aaron

1

Lo stato della casella di controllo (anche solo il modello di casella di controllo) cambia in base al fatto che il mouse lo abbia o meno. Quindi dovrebbe essere previsto un evento di cambiamento dello stato.

Quindi, controlla di nuovo per vedere in che stato è la casella di controllo e aggiornare di conseguenza. È meglio andare direttamente al modello, piuttosto che usare l'interfaccia componente "gonfia".

6

Usa c.setRolloverEnabled(false) `e non sarà possibile ottenere alcun evento per movimenti del mouse.