首页 > 解决方案 > 如何使用 JMenuItem 失去焦点或关闭 JPopupMenu

问题描述

以下示例生成一个弹出菜单。

弹出菜单包含 2 个项目。

一个是 JLabel,另一个是 JTextField。

单击任一项目时,将打印一个简单的语句。

单击 JLabel 菜单项时,弹出菜单消失。单击 JButton 菜单项时,弹出菜单仍然存在。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JToggleButton;



public class JPopupExample1 {
  public static void main(String[] argv) throws Exception 
  {
    final JPopupMenu menu = new JPopupMenu();
    JFrame frame = new JFrame("PopupSample Example");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JMenuItem item = new JMenuItem("Item Label");
    item.addActionListener(new ActionListener()
    {public void actionPerformed(ActionEvent e)
        { System.out.println("Label Pressed"); }});

    menu.add(item);

    JToggleButton jTbutton = new JToggleButton("Click Me");
    jTbutton.setToolTipText("Test Buttons");
    jTbutton.addActionListener(new ActionListener()
        {public void actionPerformed(ActionEvent e)
            {System.out.println("Button Pressed");}     });

    menu.add(jTbutton);

    frame.setLayout(null);
    JLabel label = new JLabel("Right Click here for popup menu");
    label.setLocation(10, 10);
    label.setSize(250, 50);
    frame.add(label);
    label.setComponentPopupMenu(menu);
    frame.setSize(350, 250);
    frame.setVisible(true);
  }
}

有没有一种简单的方法可以在单击 JButton 后失去焦点(而不将其发送到另一个组件),这样弹出菜单就会消失?

标签: javafocusjpopupmenu

解决方案


您可以在 Action Listener 中调用menu.setVisible(false);after 。System.out.println("Button Pressed");例如:

JToggleButton jTbutton = new JToggleButton("Click Me");
jTbutton.setToolTipText("Test Buttons");
jTbutton.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    System.out.println("Button Pressed");
    menu.setVisible(false);
  }
});

推荐阅读