java - PropertyChangeListener 中的 JOptionPane.showMessageDialog 导致意外行为

标签 java swing

我已经使用 JCheckBoxMenuItem 创建了一个可检查的菜单项。我试图做的是当复选框被选中时,应该会出现一条消息:

 JCheckBoxMenuItem checkbox = new JCheckBoxMenuItem("Checkbox");
    checkbox.addPropertyChangeListener(evt -> {
        boolean isCheck = ((JCheckBoxMenuItem) evt.getSource()).isSelected();
        if(isCheck){
            JOptionPane.showMessageDialog(null, "You checked the checkbox", "Information", JOptionPane.INFORMATION_MESSAGE);
        }
    });

但是,当我尝试选中该复选框时,什么也没有出现。我第二次点击 JMenu 时会出现一堆模态,并导致 ArrayIndexOutOfBoundsException:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 >= 0
at java.util.Vector.elementAt(Vector.java:474)
at javax.swing.MenuSelectionManager.setSelectedPath(MenuSelectionManager.java:117)
at javax.swing.MenuSelectionManager.clearSelectedPath(MenuSelectionManager.java:151)
at javax.swing.plaf.basic.BasicPopupMenuUI$MouseGrabber.cancelPopupMenu(BasicPopupMenuUI.java:917)
at javax.swing.plaf.basic.BasicPopupMenuUI$MouseGrabber.eventDispatched(BasicPopupMenuUI.java:828)
at java.awt.Toolkit$SelectiveAWTEventListener.eventDispatched(Toolkit.java:2425)
at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Toolkit.java:2317)
at java.awt.Toolkit.notifyAWTEventListeners(Toolkit.java:2275)
at java.awt.Component.dispatchEventImpl(Component.java:4777)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:109)  
...

是什么导致了这种情况?

最佳答案

What is causing that to happen?

您为错误的工作使用了错误的监听器。 PropertyChangeListener 不是您要实现的目标的合适监听器,相反,您应该使用 ActionListener...

JCheckBoxMenuItem checkbox = new JCheckBoxMenuItem("Checkbox");
checkbox.addActionListener((ActionEvent e) -> {
        boolean isCheck = ((JCheckBoxMenuItem)e.getSource()).isSelected();
        if (isCheck) {
            JOptionPane.showMessageDialog(null, "You checked the checkbox", "Information", JOptionPane.INFORMATION_MESSAGE);
        }
});

PropertyChangeListener 实际上(至少在我的测试下)在 JCheckBoxMenuItem 的选定状态发生更改时不会触发任何事件,但您的代码确实导致它不断抛出弹出一个对话框,迫使我终止程序

看看How to Use Menus , How to Use Buttons, Check Boxes, and Radio ButtonsHow to Write an Action Listeners了解更多详情

关于java - PropertyChangeListener 中的 JOptionPane.showMessageDialog 导致意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35451724/

相关文章:

用于社交网络应用程序的 Java 库

java - 从 html 中提取所有可见文本

java - 将鼠标悬停在 jtable 单元格上时显示图像

java - JTable 标题中的复选框与 Nimbus L&F 呈现不同

java swing jtextfield unicode 僧伽罗语

java - 如何使用 netbeans 将 jLabel 从 Jframe 的一侧移动到另一侧

java - 从函数java返回变量和数组

java - Java 中的 String 方法是否在 O(1) 时间内运行?

java - Spring 和 Swing 应用程序一起使用吗?

java - 通过交替切换 Action 在游戏中实现暂停