java - JCheckBox:在 ItemStateChanged 事件中两次显示 MessageDialog

标签 java swing jcheckbox

为什么我的程序在 ItemStateChanged 事件中调用 showMessageDialog 两次,即使我把它放在 if else 中?

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,程序将正确运行。

最佳答案

在显示 JOptionPane 之前,复选框的状态不会更新。 (请注意,当显示第一个选项 Pane 时,复选标记是如何不绘制的。

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

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");
                }
            }
        });
    }
});

关于java - JCheckBox:在 ItemStateChanged 事件中两次显示 MessageDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40308135/

相关文章:

java - 如何访问 Dialog Builder 内部类中的数据?

java - 如何平滑地执行放大和缩小以及在 TEXTVIEW 上的特定缩放位置进行缩放?

java - JTable 内的 MouseMotionListener

java - 如何将 JComboBox 添加到 JTable 单元格?

java - java代码中的复选框

java - 在 JFrame 中保存复选框

java - @PostAuthorize 失败时返回 404 而不是 403

Java Swing : Different TableCellRenderers

java - 调整 JFrame 大小时,如何防止 JTable 的列调整大小?

显示构造对话框时未选择 Java swing 复选框