Как мне заставить 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);
Другие вопросы по тегам