添加Enter键作为JButton加速器

时间:2014-12-13 12:13:18

标签: java swing

我使用简单的GUI构建简单的聊天应用程序,但是我在向“发送”按钮分配“输入”键时遇到问题。现在按Alt + Enter非常不实用。

public void buildInterface() {
   //some other components
    btnSend = new JButton("Send");
    btnExit = new JButton("Exit");
    btnSearch=new JButton("Search");
    btnSend.setMnemonic(KeyEvent.VK_ENTER); 

     JPanel box=new JPanel();
     add(box, BorderLayout.SOUTH);
     box.add(tfInput);
     box.add(btnSend);
     box.add(btnExit);
     box.add(btnSearch);
}

2 个答案:

答案 0 :(得分:1)

当按钮聚焦时,在大多数外观下, Enter 将激活按钮。

但是,您可以指定一个按钮作为"默认"窗口的按钮,按下 Enter 键时将激活,只要聚焦的组件不消耗它。

有关详细信息,请参阅How to Use Root PanesJRootPane#setDefaultButton

答案 1 :(得分:1)

将以下代码添加到Util类

public static void bindKeyStroke(final JButton btn, String ks) {
    final ActionListener[] alist = btn.getActionListeners();
    if (alist.length != 0) {
        AbstractAction action = new AbstractAction(btn.getText(), btn.getIcon()) {
            @Override
            public void actionPerformed(ActionEvent e) {
                for (ActionListener al : alist) {
                    ActionEvent ae = new ActionEvent(e.getSource(), e.getID(), Action.ACCELERATOR_KEY);
                    al.actionPerformed(ae);
                }
            }
        };

        KeyStroke keyStroke = KeyStroke.getKeyStroke(ks);
        btn.setAction(action);
        btn.getActionMap().put(Action.ACCELERATOR_KEY, action);
        btn.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, Action.ACCELERATOR_KEY);
    }
}

转到框架,对话框或面板构造函数,并在initComponent();

之后添加
Util.bindKeyStroke(<your button>, "alt enter");

修复双重操作,执行中

if (evt.getActionCommand().equals(Action.ACCELERATOR_KEY)) {
    // Your send action here
}