Java 在ItemListener中显示消息对话框可防止选中复选框

Java 在ItemListener中显示消息对话框可防止选中复选框,java,swing,messagebox,event-dispatch-thread,Java,Swing,Messagebox,Event Dispatch Thread,我注意到,在选择复选框时,如果在itemstener中使用消息框,将阻止复选框被选中。下面是一个完整的示例,演示了该问题: import javax.swing.*; import static java.awt.event.ItemEvent.SELECTED; import static javax.swing.JOptionPane.INFORMATION_MESSAGE; import static javax.swing.JOptionPane.showMessageDialog;

我注意到,在选择复选框时,如果在
itemstener
中使用消息框,将阻止复选框被选中。下面是一个完整的示例,演示了该问题:

import javax.swing.*;

import static java.awt.event.ItemEvent.SELECTED;
import static javax.swing.JOptionPane.INFORMATION_MESSAGE;
import static javax.swing.JOptionPane.showMessageDialog;

public class ExampleFrame extends JFrame
{
    private ExampleFrame()
    {
        JCheckBox jCheckBox = new JCheckBox("Fail");
        add(jCheckBox);

        jCheckBox.addItemListener(itemEvent ->
        {
            int stateChange = itemEvent.getStateChange();
            if (stateChange == SELECTED)
            {
                showMessageDialog(rootPane,
                        "The checkbox selection did not work.",
                        "SSCCE",
                        INFORMATION_MESSAGE);
            }
        });
    }

    public static void main(String[] arguments)
    {
        ExampleFrame exampleFrame = new ExampleFrame();
        exampleFrame.pack();
        exampleFrame.setVisible(true);
    }
}
如果要修复此代码,使其显示消息框而不中断选中复选框,最佳做法是什么

我成功地使用了一个额外的线程来执行侦听器,将其延迟100毫秒,然后在
EDT
上再次执行消息框。不过,这似乎太老套了,不被认为是一个合适的解决方案


问题是相关的,但没有得到一个像样的答案。

SwingUtilities围绕模态对话框。invokeLater

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        showMessageDialog(rootPane,
            "The checkbox selection did not work.",
            "SSCCE",
            INFORMATION_MESSAGE);
    }
});