JCheckBox:在ItemStateChanged事件中两次showMessageDialog

时间:2016-10-28 15:15:05

标签: java swing jcheckbox

为什么我的程序在showMessageDialog事件中调用ItemStateChanged两次,即使我把它放入其他地方?

private void checkBox1ItemStateChanged(java.awt.event.ItemEvent evt) {                                           
    if(evt.getStateChange() == ItemEvent.SELECTED){
        //System.out.println("Check box 1 selected");
        JOptionPane.showMessageDialog(null, "Check box 1 selected");
    }
    else{
        //System.out.println("Check box 1 deselected");
        JOptionPane.showMessageDialog(null, "Check box 1 deselected");
    }
}    

如果我只使用System.out.println,程序将正常运行。

1 个答案:

答案 0 :(得分:2)

在显示JOptionPane之前,未更新复选框的状态。 (注意显示第一个选项窗格时如何不绘制复选标记。

因此,您需要做的是确保在显示JOption窗格之前更新并重新绘制状态,方法是使用SwingUtilities.invokeLater(...)显示JOptionPane:

checkBox.addItemListener( new ItemListener()
{
    public void itemStateChanged(java.awt.event.ItemEvent evt)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                if(evt.getStateChange() == ItemEvent.SELECTED)
                {
                    JOptionPane.showMessageDialog(null, "Check box 1 selected");
                }
                else
                {
                    JOptionPane.showMessageDialog(null, "Check box 1 deselected");
                }
            }
        });
    }
});