java - 键绑定不调用 AbstractAction
问题描述
我正在制作一个用户必须按键才能移动的游戏。我正在使用键绑定,但它们不起作用。键绑定应该调用 Wp 类并打印“W 按下”,但没有任何反应。这是代码:
public class SO extends JFrame {
public static void main(String[] args) {
new SO();
}
C c;
public SO(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(500, 500);
c=new C();
c.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("W"), "wp");
c.getActionMap().put("wp", new Wp());
this.setVisible(true);
}
private class C extends JComponent {
public void paint(Graphics g){}
}
private class Wp extends AbstractAction {
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("W pressed");
}
}
}
解决方案
使用 Action 来调用类似component.getActionMap().put("doSomething", anAction);
Refer Key Binding 以获取更多信息。下面是我在另一个 Stackoverflow 问题参考链接SO Ref 链接中提到的示例代码
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ButtonBinding {
private JPanel contentPane;
private JTextField tField;
private JButton button;
private KeyStroke keyStroke = KeyStroke.getKeyStroke("ENTER");
private Action action = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ae) {
System.out.println("Action Performed");
contentPane.setBackground(Color.BLUE);
}
};
private MouseAdapter mouseActions = new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent me) {
System.out.println("Mouse Entered");
JButton button = (JButton) me.getSource();
button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, "enter");
button.getActionMap().put("enter", action);
}
@Override
public void mouseExited(MouseEvent me) {
System.out.println("Mouse Exited");
JButton button = (JButton) me.getSource();
button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, "none");
contentPane.setBackground(Color.RED);
}
};
private void displayGUI() {
JFrame frame = new JFrame("Button Binding Example");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
contentPane = new JPanel();
contentPane.setOpaque(true);
tField = new JTextField(10);
button = new JButton("Click Me");
button.addMouseListener(mouseActions);
contentPane.add(tField);
contentPane.add(button);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
new ButtonBinding().displayGUI();
}
};
EventQueue.invokeLater(runnable);
}
}
推荐阅读
- monit - Monit 路径中的通配符?
- python - 批量执行时如何将多个 Jupyter Notebook 记录到同一个日志文件中?
- c# - c# XPath获取InnerText的值
- javascript - 如何在所有视图中保持我的 req.user 不变?
- python - 为什么我明确需要 .copy() 一个 numpy 数组/列表?
- spring-boot - Spring 集成:NotWritablePropertyException - 无效的属性“内容类型”
- javascript - 两个相邻的元素,窗口高度为 100%
- r - map_int() to vectorize user defined function
- z-index - 单击时如何在顶部设置叠加层
- python - 在 django 上实现 Typeahead