java - 如何使用 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 后失去焦点(而不将其发送到另一个组件),这样弹出菜单就会消失?
解决方案
您可以在 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);
}
});
推荐阅读
- c# - Forge Configurator 的 AppBundles 是如何工作的?
- drupal - 如何在 Drupal 8 中打印特定的段落类型?
- zsh - zsh 接受语法不正确的循环结构
- swift - 无法从 JSON 中的数组中获取一个对象
- asp.net-core - OpenIdConnect 行为 Visual Studio 与 Azure
- wpf - 在 CustomUserControl 中扩展父控件的默认样式不起作用
- reactjs - 使用 ReactElement 协调类型 React.FC
- c# - 删除按钮 C# 上的密码验证条件
- javascript - 只允许使用 jQuery 检查同一 div 中的复选框
- node.js - 来自 https 节点应用程序的 API 调用永远不会到达目的地