Java 向使用 ActionListener 的 JButton 添加键侦听器或键绑定
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19066859/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Adding keylistener or key binding to JButtons that use ActionListener
提问by Alex
i need some help with adding keylistener or key bindings to the buttons from the next example. I want when i press A or B on the keyboard, to make the same action like when i press it with the mouse.
我需要一些帮助来将键侦听器或键绑定添加到下一个示例中的按钮。我希望当我在键盘上按下 A 或 B 时,做出与我用鼠标按下时相同的动作。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class NetTest {
static JButton btnA = new JButton("A");
static JButton btnB = new JButton("B");
static JPanel jp = new JPanel();
static JFrame jf = new JFrame("Test APP");
static JLabel jl = new JLabel("Which button was clicked ?");
static ActionListener action = new ActionListener() {
public void actionPerformed(ActionEvent e) {
jl.setText(((JButton)e.getSource()).getText());
}
};
public static void main(String[] args) {
jf.setVisible(true);
jf.setSize(400, 400);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jp.add(btnA);
jp.add(btnB);
jp.add(jl);
jf.add(jp);
btnA.addActionListener(action);
btnB.addActionListener(action);
}
}
采纳答案by dic19
In order to listen to KeyEvents
you need to use JComponent#getInputMap()and JComponent#getActionMap()methods to put the input event you want to listen and the correspondent action. Try this example:
为了监听KeyEvents
你需要使用JComponent#getInputMap()和JComponent#getActionMap()方法来放置你想要监听的输入事件和对应的动作。试试这个例子:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Demo{
private void initGUI(){
AbstractAction buttonPressed = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand());
}
};
JButton submit = new JButton("Submit");
submit.addActionListener(buttonPressed);
/*
* Get the InputMap related to JComponent.WHEN_IN_FOCUSED_WINDOW condition
* to put an event when A key is pressed
*/
submit.getInputMap(javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW).
put(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A,0), "A_pressed");
/*
* Add an action when the event key is "A_pressed"
*/
submit.getActionMap().put("A_pressed", buttonPressed);
/*
* Same as above when you press B key
*/
submit.getInputMap(javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW).
put(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_B,0), "B_pressed");
submit.getActionMap().put("B_pressed", buttonPressed);
JPanel content = new JPanel(new FlowLayout());
content.add(new JLabel("Test:"));
content.add(submit);
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(content);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Demo().initGUI();
}
});
}
}
Note:this example uses the same AbstractAction
when the JButton
or A/B keys are pressed, but the output will depend on who is the event source.
注意:这个例子在按下 或 A/B 键AbstractAction
时使用相同的JButton
,但输出将取决于谁是事件源。
Note 2:if you use JComponent.WHEN_IN_FOCUSED_WINDOW
condition your action will be executed anytime keys A or B are pressed. This behavior is not desired when you have text input components such as JTextfield
or JTextArea
and final user almost sure will press A or B keys many times. If that is the case then you'll have to use JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
condition.
注意 2:如果您使用JComponent.WHEN_IN_FOCUSED_WINDOW
条件,您的操作将在按下 A 或 B 键时执行。当您有文本输入组件(例如JTextfield
或 )JTextArea
并且最终用户几乎肯定会多次按下 A 或 B 键时,不需要这种行为。如果是这种情况,那么您将不得不使用JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
条件。
回答by Polentino
If I understood what you want to achieve, basically you want to listen for two specific keyboards events ( key "A" or "B" pressed ), and toggle the label as if you clicked one of the two JButton.
如果我理解您想要实现的目标,基本上您想监听两个特定的键盘事件(按下键“A”或“B”),并切换标签,就像单击两个 JButton 中的一个一样。
You simply need to add a KeyListener to your frame, and implement its callbacks to respond to "A" or "B" typed only. Also remember to call setFocusable(false) on your JFrame object
您只需将 KeyListener 添加到您的框架中,并实现其回调以仅响应键入的“A”或“B”。还记得在你的 JFrame 对象上调用 setFocusable(false)
jf.setFocusable(true);
jf.addKeyListener( new KeyListener() {
@Override
public void keyTyped( KeyEvent evt ) {
}
@Override
public void keyPressed( KeyEvent evt ) {
}
@Override
public void keyReleased( KeyEvent evt ) {
}
} );