Java 向使用ActionListener的JButton添加keylistener或键绑定
在下一个示例中,我需要一些关于向按钮添加keylistener或键绑定的帮助。我想当我按下键盘上的A或B时,做出和用鼠标按下一样的动作Java 向使用ActionListener的JButton添加keylistener或键绑定,java,swing,jbutton,keylistener,Java,Swing,Jbutton,Keylistener,在下一个示例中,我需要一些关于向按钮添加keylistener或键绑定的帮助。我想当我按下键盘上的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;
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);
}
}
为了收听
KeyEvents
,您需要使用和方法来放置要收听的输入事件和相应的操作。试试这个例子:
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();
}
});
}
}
注意:当按下JButton
或A/B键时,此示例使用相同的AbstractAction
,但输出将取决于谁是事件源
注2:如果您使用
JComponent.WHEN_IN_FOCUSED_WINDOW
条件,则只要按A或B键,您的操作就会执行。当您有文本输入组件,如JTextfield
或JTextArea
且最终用户几乎肯定会多次按A或B键时,不需要此行为。如果是这种情况,那么您将不得不使用JComponent.WHEN\u FOCUSED\u组件的祖先\u
条件 如果我理解您想要实现的目标,那么基本上您需要监听两个特定的键盘事件(按下“A”键或“B”键),并切换标签,就像您单击两个按钮之一一样
您只需向框架中添加一个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 ) {
}
} );
dic19我按照您对保存按钮所说的那样完成了我的功能。这是我的代码。但它对我不起作用。我在这里添加了我的代码。请检查并帮助我。AbstractAction buttonPressed=new AbstractAction(){@Override public void actionPerformed(ActionEvent e2){System.out.println(e2.getActionCommand());};buttonSave.addActionListener(buttonPressed);buttonSave.getInputMap(javax.swing.JComponent.WHEN_在聚焦窗口中)。put(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S,0),“保存”);buttonSave.getActionMap().put(“保存”,buttonPressed);