我以前使用过Java的KeyListener,但是由于我的程序要求更高,我已经获得了建议切换到KeyBinds的建议。
首先,我尝试向不起作用的JFrame添加键绑定(我不明白我需要使用什么JComponent。)。因此,我尝试将程序移到JPanel上,然后将其添加到JFrame中,但是当按下所需的按钮(在本例中为“ 1”按钮)时,按键绑定不会反应;
在方法调用中,我已将操作设置为Print“ Hi”。这是代码:
public class Panel extends javax.swing.JPanel {
JPanel Panel = new JPanel();
/**
* Creates new form Panel
*/
public Panel() {
addKeyBinding(Panel, KeyEvent.VK_1, "1Button", (evt)->{
System.out.println("Hi");
});
initComponents();
}
... 这是方法 .....
public static void addKeyBinding(JComponent comp, int keyCode, String id, ActionListener actionListener){
InputMap im = comp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap ap = comp.getActionMap();
im.put(KeyStroke.getKeyStroke(keyCode, 0, false),
id);
ap.put(id, new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e) {
actionListener.actionPerformed(e);
}
});
}
我在做什么错?谢谢!
答案 0 :(得分:2)
键绑定用于您的表单面板,对吗?我认为您误解了有关类和对象的一些概念。另外,如果没有完整的代码,很难提供帮助。但是您的错误很可能是由以下行引起的:
addKeyBinding(Panel, KeyEvent.VK_1, "1Button", ...
应为:
addKeyBinding(this, KeyEvent.VK_1, "1Button", ...
变量Panel
应替换为关键字this
,以引用实际的表单面板。
还应在创建窗口的任何位置创建它,以便也可以删除此行:
JPanel Panel = new JPanel();
您的代码有很多错误。我无法想象第一个代码段中的代码甚至可以编译。您正在尝试使用与类名相同的名称来命名变量。
您的课程没有理由扩展JPanel,因为它不是JPanel的新类型。只需删除您的扩展。然后将第一行更改为:
JPanel panel = new JPanel();
然后将小写面板传递给addKeyBinding
方法。
如果出于某种奇怪的原因,您想让您的类扩展JPanel,则按照/ u / tiiv的说明将this
作为第一个参数传递给addKeyBinding
,并删除JPanel Panel = new JPanel
行,因为不需要(因为您现在编写的类是 JPanel)。
就使用哪个组件JFrame
而言,它是一个顶层容器,因此通常是您的主应用程序窗口。然后将JPanel和其他组件放在JFrame中。实际上,有4个顶级容器处于摇摆状态(JFrame,JWindow,JDialog和JApplet),但是JFrame通常是您将用作主应用程序窗口的容器。
我希望有帮助。