1

こんにちは、JcheckBoxリスナーにjoptionpaneを追加するのに苦労しています


public void itemStateChanged(ItemEvent evt) {

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

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

正常に動作しますが、問題は JCheckBox が選択され、すぐに選択解除されることです。どうすればこれを修正できますか?

乾杯

4

2 に答える 2

3

項目リスナーの代わりにアクション リスナーを使用するためのいくつかの提案 (解決策) があります。これは機能しますが、私が持っているすべてのテキストが項目リスナーを示唆していることを考えると、奇妙に思えました。

実際、これはOracle Bug ID:6924233で確認されている既知のバグであり、 JOptionPane によって別のイベントが生成されるようです。

推奨される修正は、invokeLater を使用して JOptionPane を呼び出すことです。これは正常に機能し、他の目的でアイテム リスナーを既に使用しているプログラムにわずかなコード変更を加えるだけで済みます。

于 2011-11-28T05:50:55.567 に答える
2

次のテストプログラムは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 呼び出しの省略されたコードを見てください。

于 2010-03-28T13:34:12.807 に答える