2014-12-13 39 views
0

我正在用简单的GUI构建简单的聊天应用程序,但是我有一个问题,将Enter键指定给发送按钮。现在按Alt + Enter是非常不切实际的。添加Enter键作为JButton加速器

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); 
} 

回答

1

当按钮被聚焦,在大多数的外观和感觉输入将激活按钮。

但是,您可以指定一个按钮作为该窗口的“默认”按钮,只要被聚焦的组件不消耗该按钮,该按钮将在按下按钮时激活。

How to Use Root PanesJRootPane#setDefaultButton更多细节

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 
}