package dadjf;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class Test extends JPanel implements MouseListener{
JPopupMenu popupMenu;
public static void main(String [] args){
Test test = new Test();
}
public Test() {
JFrame jframe = new JFrame();
JMenuBar menuBar = new JMenuBar();
// Options Menu
JMenu optionsMenu = new JMenu("Options");
optionsMenu.setMnemonic(KeyEvent.VK_O);
optionsMenu.getAccessibleContext().setAccessibleDescription("Options Menu");
menuBar.add(optionsMenu);
JMenuItem broadenMenuItem = new JCheckBoxMenuItem("Broaden Parent Search", false);
broadenMenuItem.setAccelerator(KeyStroke.getKeyStroke("B"));
broadenMenuItem.getAccessibleContext().setAccessibleDescription("Broadens the parent search");
optionsMenu.add(broadenMenuItem);
this.add(menuBar, "dock north");
popupMenu = new JPopupMenu();
final JMenu firstSubmenu= new JMenu("First Submenu");
final JMenu secondSubmenu= new JMenu("Second Submenu");
JTextField firstTextField = new JTextField(30);
JTextField secondTextField = new JTextField(30);
firstSubmenu.add(firstTextField);
secondSubmenu.add(secondTextField);
popupMenu.add(firstSubmenu);
popupMenu.add(secondSubmenu);
jframe.add(this);
this.setVisible(true);
jframe.setVisible(true);
this.add(popupMenu);
this.add(new JTextField(30));
this.addMouseListener(this);
}
@Override
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
popupMenu.show(e.getComponent(), e.getX(), e.getY());
}
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}
我希望它是这样的,如果我右键单击并开始在子菜单文本字段中键入,如果我在字段中键入'b',它不会立即关闭弹出窗口并触发复选框。
在我的实际代码中,我有~10个加速器,所以我想知道一个我可以通用的解决方案,而不需要硬编码10个独立的中断器。
答案 0 :(得分:2)
我怎样才能这样做,当我在这个弹出窗口中打字时,加速器没有被触发?
加速器和助记符使用Key Bindings
将KeyStroke
映射到Action
。即使组件没有焦点,这些绑定也可以调用Action,就像菜单一样。
我可以在文本字段中添加某种监听器吗?
您可以将自己的键绑定添加到文本字段中。这是具有焦点的组件的键绑定优先于菜单的键绑定。
阅读How to Use Key Bindings上Swing教程中的部分,了解更多信息和示例。
您需要为用作助记符的每个字符执行单独的绑定。我不知道你是否可以创建一个什么都不做的虚拟Action(因此可以使用文本字段的默认行为),或者你是否真的需要自己将字符插入到文本字段中。