在输入child时防止加速器触发

时间:2016-03-02 17:12:32

标签: java swing

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个独立的中断器。

1 个答案:

答案 0 :(得分:2)

  

我怎样才能这样做,当我在这个弹出窗口中打字时,加速器没有被触发?

加速器和助记符使用Key BindingsKeyStroke映射到Action。即使组件没有焦点,这些绑定也可以调用Action,就像菜单一样。

  

我可以在文本字段中添加某种监听器吗?

您可以将自己的键绑定添加到文本字段中。这是具有焦点的组件的键绑定优先于菜单的键绑定。

阅读How to Use Key Bindings上Swing教程中的部分,了解更多信息和示例。

您需要为用作助记符的每个字符执行单独的绑定。我不知道你是否可以创建一个什么都不做的虚拟Action(因此可以使用文本字段的默认行为),或者你是否真的需要自己将字符插入到文本字段中。

相关问题