“我发现了一些与 actionMap 相关的东西。我看起来很复杂。”
一点也不复杂。您要做的是使用Action(与带有回调的ActionListener相似),它可以分配给不同的组件。您可以将相同的Action 用于JPanel 和 JButton。
假设你有这个Action
Action printHelloAction = new AbstractAction("Print") {
public void actionPerformed(ActionEvent e) {
System.out.println("Hello");
}
};
您要做的是将其添加到JPanel 的ActionMap、InputMap,和同时只需将Action 添加到JButton
JPanel panel = new JPanel();
InputMap im = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_P, ActionEvent.CTRL_MASK), "printAction");
ActionMap am = panel.getActionMap();
am.put("printAction", printHelloAction); // add to JPanel ActionMap
JButton button = new JButton(printHelloAction); // add to JButton
button.setText("Print Hello");
您可以看到我对JPanel 键绑定和JButton 使用了相同的Action。
查看更多 How to use Action 和 How to Use Key Bindings
这是上面代码中的一个示例。使用 Ctrl + P
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
public class KeyBindActionDemo {
public KeyBindActionDemo() {
Action printHelloAction = new AbstractAction("Print") {
public void actionPerformed(ActionEvent e) {
System.out.println("Hello");
}
};
JPanel panel = new JPanel();
InputMap im = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_P, ActionEvent.CTRL_MASK), "printAction");
ActionMap am = panel.getActionMap();
am.put("printAction", printHelloAction);
JButton button = new JButton(printHelloAction);
button.setText("Print Hello");
panel.add(button);
JFrame frame = new JFrame();
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new KeyBindActionDemo();
}
});
}
}