2012-02-16 98 views
2

如何听按键并触发JButton?Java听按钮和键盘单击

例如:

我有 “A” 的JButton作为面板上的GUI。我在“aButton”上实现了一个buttonListener,它会将屏幕更改为其他内容。我希望这个按钮可以通过点击鼠标和键盘来触发。

如何在触发此“A”JButton的同时按下键盘上的“a”,同时还实现了buttonListener?

我目前的代码无法触发按键事件。

ButtonListener listener; 
KeyboardListener keyboardListener; 
private JButton aButton; 

public MyButtonPanel() { 
    listener = new ButtonListener(); 

    aButton = new JButton ("A"); 
    aButton.setFont (BUTTON_TEXT); 
    aButton.setPreferredSize (new Dimension (60,30)); 
    aButton.addActionListener (listener); 
    aButton.addKeyListener (keyboardListener); 

    setLayout (new BorderLayout()); 
    add (aButton, BorderLayout.CENTER); 

} 

private class KeyboardListener implements KeyListener 
{ 
    public void keyPressed(KeyEvent arg0) { 
     char c = arg0.getKeyChar(); 
     System.out.println("Pressed " + c); 
    } 

    public void keyReleased(KeyEvent arg0) { 
     char c = arg0.getKeyChar(); 
     System.out.println("Released " + c); 
    } 

    public void keyTyped(KeyEvent arg0) { 
     char c = arg0.getKeyChar(); 
     System.out.println("Typed " + c); 
    } 

} 

private class ButtonListener implements ActionListener { 
    public void actionPerformed (ActionEvent event) { 
    Object source = event.getSource(); 

    if (source == aButton) { 
     System.out.println("This is a"); 
    } 
    } 
} 

}

+1

请阅读有关助记符的在这里http://docs.oracle.com/javase/tutorial/uiswing/components/button.html 有一些JButton键盘笔画链接的例子 – Sean 2012-02-16 15:51:34

+0

我明白了所以我可以使用像这样b3.setMnemonic(KeyEvent.VK_E); b3.setActionCommand(“enable”); – nowhere 2012-02-16 16:07:50

回答

5

创建操作。然后通过使用ActionListener将Action添加到按钮。通过将Action绑定到KeyStroke来处理键盘事件。

阅读Swing tutorial。有一节:

  1. 如何使用操作
  2. 如何使用按键绑定

,让你开始。

或者你也可以只是指定一个助记符来调用按钮。阅读JButton API。

+0

我的不好,只是看着你的最后一行。只是我现在不能删除我的答案,我的不好。它说我今天不能删除我的答案。虽然信息+1。 – 2012-02-16 16:22:56

1

还有一种方法可以实现您想要的功能,只需将注释行添加到您的代码部分即可。

aButton = new JButton ("A"); 
aButton.setFont (BUTTON_TEXT); 
// Doing this will also allow you to use your Keyboard for this JButton. You have to 
// press ALT+A in this case to make it work. 
//aButton.setMnemonic(KeyEvent.VK_A); 

如果你只有一个按钮,你是关心你可以使按钮在这种情况下,默认的JButton过,这样做:

yourFrameObject.getRootPane().setDefaultButton(aButton); 

现在上的输入按键将按照其actionPerformed()方法中的描述完成工作。

注意:默认按钮功能的确切实现取决于外观和感觉。例如,在Windows的外观和感觉中,默认按钮更改为具有焦点的按钮,以便按下Enter键单击焦点按钮。当没有按钮具有焦点时,最初指定为默认按钮的按钮再次成为默认按钮。

+0

感谢您的信息..对于这个基本问题抱歉:有没有办法让助记符没有按ALT键激活? – nowhere 2012-02-16 16:31:33

+0

@nowhere:好像KeyBinding就是这样的答案。否则,如果它只是您关心的一个按钮,请将该按钮设置为默认值,如我在答案的下半部分所述。使您的按钮成为默认设置将使其按一下ENTER键即可工作。只是我的答案中提到的一行会为你做这个技巧。助记符意味着与ALT工作,我猜:-) – 2012-02-16 16:35:37

+0

我明白了。好吧,我会看看KeyBinding并在代码上尝试。我需要实现多个按钮。这只是开始。 :)但谢谢你的默认按钮的解释。 – nowhere 2012-02-16 16:41:54

1

按顺序使用键绑定将输入键与特定组件绑定。 你的情况,你可以使用

aButton.getInputMap().put(KeyStroke.getKeyStroke("ENTER"),"pressed"); 
aButton.getActionMap().put("pressed",btnAction); 

其中pressed是特定部件与btnAction这是一个行动的参考链接的关键字。可以使用AbstractAction()创建一个操作,您可以在其中指定要执行的操作。 如果你想在同一组件响应鼠标点击,你可以使用的方法

aButton.addActionListener(btnAction); 

因为ActionActionListener接口扩展,这将不会导致出现问题。