Java KeyBindings 对 JPanel 没有反应
Java KeyBindings not reacting on JPanel
我以前使用过 Java 的 KeyListener,但由于我的程序要求更高,我得到了切换到 KeyBinds 的建议。
首先,我尝试向 JFrame 添加键绑定,但没有成功(我不明白我需要使用什么 JComponent。)。因此,我尝试将程序移至 JPanel,然后将其添加到 JFrame,但是当按下所需按钮(在本例中为“1”按钮)时,按键绑定没有反应;
在方法调用中,我已将操作设置为打印 "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);
}
});
}
我做错了什么?谢谢!
键绑定是针对您的表单面板的,对吧?我认为您误解了一些关于 classes 和对象的概念。如果没有看到完整的代码,也很难提供帮助。但是你的错误很可能是由这一行引起的:
addKeyBinding(Panel, KeyEvent.VK_1, "1Button", ...
应该是:
addKeyBinding(this, KeyEvent.VK_1, "1Button", ...
变量 Panel
应替换为关键字 this
,从而引用实际的表单面板。
它也应该在您创建 window 的任何地方创建,因此也可以删除此行:
JPanel Panel = new JPanel();
您的代码有很多问题。我无法想象第一个片段中的代码甚至可以编译。您正在尝试命名一个与您的 class 名称相同的变量。
您的 class 没有理由扩展 JPanel,因为它不是新类型的 JPanel。只需删除您的扩展。然后将第一行改为:
JPanel panel = new JPanel();
然后将 lower-case 面板传递给 addKeyBinding
方法。
如果出于某种奇怪的原因你想保留你的 class 扩展 JPanel 然后将 this
作为第一个参数传递给 addKeyBinding
如 /u/tiiv 所说并删除 JPanel Panel = new JPanel
行,因为不需要它(正如您现在所写的那样,您的 class 是 JPanel)。
至于要使用哪个组件 JFrame
是一个 top-level 容器,所以它通常是您的主要应用程序 window。然后将 JPanel 和其他组件放入 JFrame 中。 swing 中实际上有 4 个 top-level 容器(JFrame、JWindow、JDialog 和 JApplet),但 JFrame 通常是您将用作主应用程序的容器 window。
希望对您有所帮助。
我以前使用过 Java 的 KeyListener,但由于我的程序要求更高,我得到了切换到 KeyBinds 的建议。
首先,我尝试向 JFrame 添加键绑定,但没有成功(我不明白我需要使用什么 JComponent。)。因此,我尝试将程序移至 JPanel,然后将其添加到 JFrame,但是当按下所需按钮(在本例中为“1”按钮)时,按键绑定没有反应;
在方法调用中,我已将操作设置为打印 "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);
}
});
}
我做错了什么?谢谢!
键绑定是针对您的表单面板的,对吧?我认为您误解了一些关于 classes 和对象的概念。如果没有看到完整的代码,也很难提供帮助。但是你的错误很可能是由这一行引起的:
addKeyBinding(Panel, KeyEvent.VK_1, "1Button", ...
应该是:
addKeyBinding(this, KeyEvent.VK_1, "1Button", ...
变量 Panel
应替换为关键字 this
,从而引用实际的表单面板。
它也应该在您创建 window 的任何地方创建,因此也可以删除此行:
JPanel Panel = new JPanel();
您的代码有很多问题。我无法想象第一个片段中的代码甚至可以编译。您正在尝试命名一个与您的 class 名称相同的变量。
您的 class 没有理由扩展 JPanel,因为它不是新类型的 JPanel。只需删除您的扩展。然后将第一行改为:
JPanel panel = new JPanel();
然后将 lower-case 面板传递给 addKeyBinding
方法。
如果出于某种奇怪的原因你想保留你的 class 扩展 JPanel 然后将 this
作为第一个参数传递给 addKeyBinding
如 /u/tiiv 所说并删除 JPanel Panel = new JPanel
行,因为不需要它(正如您现在所写的那样,您的 class 是 JPanel)。
至于要使用哪个组件 JFrame
是一个 top-level 容器,所以它通常是您的主要应用程序 window。然后将 JPanel 和其他组件放入 JFrame 中。 swing 中实际上有 4 个 top-level 容器(JFrame、JWindow、JDialog 和 JApplet),但 JFrame 通常是您将用作主应用程序的容器 window。
希望对您有所帮助。