JOptionPane появится на выбранном JCheckBox - PullRequest
1 голос
/ 28 марта 2010

Привет всем, у меня возникли некоторые трудности с добавлением joptionpane в JcheckBox слушатель


public void itemStateChanged(ItemEvent evt) {

            if(evt.getStateChange() == ItemEvent.SELECTED){
                    ///some code

                        JOptionPane.showMessageDialog(null,  "Message", "Alert",
                                JOptionPane.INFORMATION_MESSAGE);
            }
    }

так что все работает нормально, но проблема в том, что JCheckBox выбирается и сразу отменяется, как мне это исправить?

Приветствия

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Здесь есть несколько предложений (решение) использовать прослушиватель действий вместо прослушивателя элементов. Это работает, однако, хотя это странно, учитывая, что во всех текстах, которые я предлагаю, слушатель элемента является ожидаемым типом слушателя для флажка.

На самом деле это известная ошибка, подтвержденная Идентификатор ошибки Oracle: 6924233 Очевидно, что JOptionPane вызывает другое событие.

Рекомендуемое исправление - вызвать JOptionPane, используя invokeLater. Это работает нормально и включает в себя только незначительное изменение кода в программе, уже использующей прослушиватель элементов для других целей.

2 голосов
/ 28 марта 2010

Проблема должна быть в "/// некоторый код", так как у меня работает следующая тестовая программа на Java 6:

public class CheckBoxItemListener {
    public static void main(String[] args) {
        final JCheckBox checkBox = new JCheckBox("Click me");

        JFrame frame = new JFrame("CheckBox Item Listener");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(100, 100, 300, 300);
        frame.add(checkBox);
        frame.setVisible(true);

        checkBox.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent evt) {
                if (evt.getStateChange() == ItemEvent.SELECTED){
                    JOptionPane.showMessageDialog(null,  "Message", "Alert",
                            JOptionPane.INFORMATION_MESSAGE);
                }
            }
        });
    }
}

Посмотрите пропущенный код для вызовов setSelected или doClick.

...