Как мне заставить JCheckBox работать так, как я хочу
Я создал панель инструментов со спиннером и флажком.
Спиннер работает как я ожидаю. Когда я изменяю значение, слушатель вызывается И значение спиннера ИЗМЕНЯЕТСЯ.
НО, для флажка, слушатель срабатывает, когда я перемещаюсь по нему (в отличие от счетчика), и проверенное значение ODDLY НЕ ИЗМЕНЯЕТСЯ, если я не удаляю инструкцию JOptionPabe. Как мне написать CheckBox?
final JSpinner spin2 = new JSpinner();
spin2.setModel(new SpinnerNumberModel(10, 1, 3000, 1));
ChangeListener listener2 = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
// TODO Auto-generated method stub
JOptionPane.showMessageDialog(null,"Spinner change");
//show();
}
};
spin2.addChangeListener(listener2);
toolBar.add(spin2);
final JCheckBox AlertAudible = new JCheckBox("Audible");
AlertAudible.setSelected(true);
AlertAudible.setText("Audible");
AlertAudible.setForeground(Color.WHITE);
ChangeListener listener4 = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
// TODO Auto-generated method stub
JOptionPane.showMessageDialog(null,"Alert check");
//starterModule.sigmaAlertAudible = AlertAudible.isSelected();
//show();
}
};
ОК, я изменил его на ItemListener:
ItemListener listener4 = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
JOptionPane.showMessageDialog(null,"Alert check SELECTED :"+e.getStateChange());
}
if (e.getStateChange() == ItemEvent.DESELECTED){
JOptionPane.showMessageDialog(null,"Alert check DESELECTED :"+e.getStateChange());
}
}
}
Как-то раз мой JOptionPane вызывается ДВАЖДЫ каждый раз, когда я отмечаю флажок! И ВЫБРАННЫЕ, и ИЗБРАННЫЕ. ТАК значение остается неизменным!
2 ответа
Вам нужно использовать ItemListener
как рекомендуется, также используйте следующий трюк с SwingUtilities.invokeLater()
, и ваш JOptionPane
будет вызван только один раз:
ItemListener listener4 = new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if (e.getStateChange() == ItemEvent.SELECTED) {
JOptionPane.showMessageDialog(null,"Alert check SELECTED :"+ e.getStateChange());
} else if (e.getStateChange() == ItemEvent.DESELECTED) {
JOptionPane.showMessageDialog(null,"Alert check DESELECTED :"+ e.getStateChange());
}
}
});
}
};
кажется это ошибка
Я думаю, что вам нужен ItemListener, а не ChangeListener. Смотрите пример здесь: http://docs.oracle.com/javase/tutorial/uiswing/components/button.html
ItemListener listener4 = new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
JOptionPane.showMessageDialog(null,"Alert check :"+e.getStateChange());
}
}
};
AlertAudible.addItemListener(listener4);