当前位置: 首页 > 面试题库 >

JMenu在Windows7 LAF Java7中使用focuslost事件

卢伟志
2023-03-14
问题内容

如果在单击另一个组件时弹出菜单仍处于打开状态,则该组件不会获取该事件,因为该事件可能已被弹出窗口占用。通常,所有JPopupmenus都会发生这种情况。仅在具有Windows
LAF(Windows7)的Java 7中会发生这种情况。有解决方法吗?它是已知的错误吗?

import javax.swing.*;
import java.awt.event.*;

public class Test
{
    public static void main(String[] s)
    throws Exception
    {
           String lookAnfFeelClassName = UIManager.getSystemLookAndFeelClassName();
           UIManager.setLookAndFeel(lookAnfFeelClassName);

           JMenu menu = new JMenu("TEST Menu");
           JMenuItem menuItem = new JMenuItem("Menu Item 1");

           JMenuBar menuBar = new JMenuBar();
           menu.add(menuItem);
           menuBar.add(menu);

           final JButton b = new JButton("Test");
           b.setBounds(5, 50, 60, 20);
           b.addActionListener(new ActionListener()
           {
                  public void actionPerformed(ActionEvent e)
                  {
                        //If the Menu is open when I press the button, the putton is not pressed 
                        //so I have to press it again. 
                        JOptionPane.showMessageDialog(b, "Button Pressed");
                  }
           }
           );

           JFrame frame = new JFrame();
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           frame.setSize(150, 150);
           frame.setJMenuBar(menuBar);
           frame.getContentPane().setLayout(null);
           frame.getContentPane().add(b);
           frame.setVisible(true);           
    }
}

问题答案:

这是解决该问题的魔术路线:

UIManager.put("PopupMenu.consumeEventOnClose", Boolean.FALSE);

在查看BasicPopupMenuUI类的源代码后,我发现了这一点。显然,根据代码中的以下注释,此行为是有意的设计选择,但对我来说确实感觉像是个错误。

            // Ask UIManager about should we consume event that closes
            // popup. This made to match native apps behaviour.

顺便说一下,它也发生在Java 5和6中。



 类似资料:
  • 介绍 (Introduction) Menu类表示从菜单栏部署的下拉菜单组件。 Class 声明 (Class Declaration) 以下是javax.swing.JMenu类的声明 - public class JMenu extends JMenuItem implements Accessible, MenuElement 字段 (Field) 以下是java.awt

  • jMenu是一个简单的轻量级水平下拉菜单插件,你可以使用嵌套的UI列表来创建无限级的菜单。它拥有很平滑的移动效果,菜单样式也可以自定义修改,定制性很高。

  • 问题内容: 我想知道是否可以测试是否单击了JMenu(而不是JMenuItem)。我尝试向其中添加一个ActionListener,但似乎无法识别它。我只需要它在按下JMenu按钮时执行一个操作,以便可以在打开菜单之前更改该菜单的JMenuItems。也欢迎所有取得这一结果的工作! 谢谢 问题答案: 对于使用 码 仅用于ButtonModel

  • 主要内容:1 Java JMenuBar JMenu JMenuItem的介绍,2 Java JMenuBar JMenu JMenuItem的声明,3 Java JMenuBar JMenu JMenuItem的案例1,4 Java JMenuBar JMenu JMenuItem的案例21 Java JMenuBar JMenu JMenuItem的介绍 JMenuBar类用于在窗口或框架上显示菜单栏。它可能有几个菜单。 JMenu类的对象是从菜单栏显示的下拉菜单组件。它继承了JMenuIt

  • 我将HiberNate与Panache一起使用,并且需要在应用程序启动时添加用户。为此,我使用注释我的bean,然后我有一个带有注释的方法。 目前,我正在使用以下代码: 据我发现,当调用此方法时,不能保证所有内容都已经设置好,我想这就是为什么它有时会失败并出现错误的原因。我已经检查过这个问题,但由于它是针对 Spring 的,因此该方法不起作用,我没有找到任何类似的东西 Quarkus。 我是否缺

  • 朋友们早上好,我的问题如下。我有一个带有按钮的cardview,我在recyclerview中捕捉按钮事件,但我想在包含recyclerview的片段中捕捉按钮事件。 我需要利用这里的事件。 提前感谢。