使用KeyBIndings响应Button

我想用这些目标制作一个程序:

1)创建JButton 2)使用KeyBindings将按钮附加到键(“A”键)3)单击“A”时执行一些代码

这是我到目前为止的代码:

// Imports Public class Test{ JButton button = new JButton(); //... Test(){ button.getInputMap().put(KeyStroke.getKeyStroke("A"), "Pressed"); //... } // Where do I add the code that responds when button is pressed? } 

现在,在按下按钮时,我在哪里添加我希望它执行的代码?

你需要添加一个动作监听器,具体针对actionPerformed。 在构造函数中的某处声明:

 import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.KeyStroke; public class Main { public static void main(String[] argv) throws Exception { JButton component = new JButton(); MyAction action = new MyAction(); component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("F2"), action.getValue(Action.NAME)); } } class MyAction extends AbstractAction { public MyAction() { super("my action"); } public void actionPerformed(ActionEvent e) { //Here goes the code where the button does something System.out.println("hi");//In this case we print hi } } 

在这个例子中,如果我们按F2,它将相当于按下按钮。

我能想到的两种方式:

  • JButton和Key Bindings共享相同的AbstractAction,或者更好
  • 只需在键绑定按钮上调用doClick()即可。

KeyBindingEg.java

 import java.awt.event.*; import javax.swing.*; public class KeyBindingEg extends JPanel { private JButton btnA = new JButton(); public KeyBindingEg() { Action btnAction = new ActionOne("A"); Action keyBindingAction = new ActionTwo(); int condition = JLabel.WHEN_IN_FOCUSED_WINDOW; InputMap inputmap = btnA.getInputMap(condition); ActionMap actionmap = btnA.getActionMap(); final String aKeyPressed = "a key pressed"; inputmap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), aKeyPressed ); actionmap.put(aKeyPressed, keyBindingAction); // actionmap.put(aKeyPressed, btnAction); // one or the other, your choice btnA.setAction(btnAction); add(btnA); } private class ActionOne extends AbstractAction { public ActionOne(String text) { super(text); } @Override public void actionPerformed(ActionEvent e) { sharedMethod(); } } private class ActionTwo extends AbstractAction { @Override public void actionPerformed(ActionEvent e) { btnA.doClick(); } } private void sharedMethod() { System.out.println("Method called by either key bindings or action listener"); } private static void createAndShowGui() { JFrame frame = new JFrame("KeyBindingEg"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new KeyBindingEg()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } }