代码之家  ›  专栏  ›  技术社区  ›  BullyWiiPlaza

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

  •  1
  • BullyWiiPlaza  · 技术社区  · 6 年前

    我注意到当在 ItemListener 选择复选框时,它将阻止复选框被选中。下面是一个完整的例子,演示了这个问题:

    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 . 不过,这似乎太老套了,不能被认为是一个合适的解决方案。

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   gtgaxiola    6 年前

    围绕你的模态对话 SwingUtilities.invokeLater

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