2009-08-19 3 views
9

Может кто-нибудь объяснить мне, почему этот кусок кода выдается на консоль, когда вы наводите мышь на флажок? Что такое событие «изменения»?JCheckbox change listener получает уведомление о событиях

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); 
    } 

} 

Примечание: Я не использовать слушатель действия, потому что в моей программе я хочу быть в состоянии сделать:

checkBox.setSelected(boolean) 

и есть мой слушатель уведомил, что не может быть сделано с action слушатель. Итак, есть ли способ отключить это событие «мышь» или другим способом, которым я могу реализовать свой слушатель?

+0

Странно, я подумал, что использование 'setSelected' вызовет прослушиватели изменений. Я должен думать о чем-то другом. – jeef3

+0

Если я запустил это на Java 5 на Mac OSX, я не наводил указатель мыши на события. – banjollity

+0

@ jeef3: setВыбранные события смены триггера DOES. Вот почему я его использую. Дело в том, что события изменения также срабатывают от мыши над движениями :) –

ответ

28

Вы получаете события на мыши, так как фокус, полученный/потерянный, представляет собой изменение состояния компонента.

Вместо этого вы можете использовать ItemListener, который даст вам ItemEvents.

Объект, реализующий интерфейс ItemListener, получает этот ItemEvent, когда происходит событие. Слушатель избавляется от деталей обработки отдельных движений мыши и щелчков мыши и может вместо этого обрабатывать «осмысленное» (семантическое) событие, например «выбранный элемент» или «элемент отменен».

Вы можете добавить его в свой флажок с помощью метода addItemListener() в классе AbstractButton. Просто замените addChangeListener с этим:

c.addItemListener(new ItemListener() { 

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

Спасибо, что работает. Я всегда, хотя прослушиватели элементов применяются только к списку, как к компонентам. :) –

+1

Нет проблем. Это фактически ListSelectionListener, который используется для списков. Существует другой интерфейс для списков и кнопок, потому что выбор списка должен поддерживать выбор диапазона ячеек, для которого требуется другой тип события. – Aaron

1

Состояние флажка (даже модели флажка) изменяется в зависимости от того, имеет ли он на нем мышь или нет. Поэтому следует ожидать события изменения состояния.

Итак, просто загляните назад, чтобы узнать, в каком состоянии установлен флажок и соответствующим образом обновить. Лучше идти прямо к модели, а не использовать «раздутый» компонентный интерфейс.

6

Используйте c.setRolloverEnabled(false) `, и вы не получите какое-либо событие для движений мыши.

Смежные вопросы