【问题标题】:KeyListener not working in JPanel?KeyListener 在 JPanel 中不起作用?
【发布时间】:2013-11-19 03:59:49
【问题描述】:

我正在尝试在 java 类中使用 KeyListener,但由于某些奇怪的原因它不接受输入。我最近遇到了这个问题,在它运行完美之前,但发生了一些变化,现在它不接受任何输入。这是我的代码的摘录:

public class SquarePanel extends JPanel implements Runnable, KeyListener, MouseListener
...
public SquarePanel {
    this.setFocusable(true);
    this.requestFocusInWindow();
    addKeyListener(this);

然后我继续覆盖 keyPressed:

@Override
public void keyPressed(KeyEvent e)
{
    System.out.println("SOMETHING");
}

然而什么也没发生。我是不是做错了什么?

(旁注:我认为我的程序没有获得焦点,这就是问题所在,因为当我使用 isFocusOwner() 时它出现错误。如果是这种情况,我该如何解决?)

【问题讨论】:

  • 可能是因为你在构造函数中请求了焦点,这是在它实际添加到任何窗口之前。检查requestFocusInWindow()的返回值是否成功。

标签: java keylistener


【解决方案1】:

我认为我的程序没有获得焦点,这就是问题所在,

这是 KeyListener 不起作用时的常见问题。

 this.requestFocusInWindow();

上述语句仅在 GUI 当前可见时才有效。由于您在面板构造函数中执行该语句,因此它没有任何效果。组件必须显示在可见的 GUI 上才能让组件请求焦点。

您必须在 GUI 可见后请求焦点。

或者,另一种选择是使用RequestFocusListener

为什么要使用 KeyListener? Swing 旨在与KY Bindings 一起使用。

【讨论】:

  • 我不相信是这种情况,因为我在this.setFocusable 之前添加了System.out.println(this.isVisible()) 并且它输出为true。另外我没有使用键绑定,因为我没有受过教育:p 感谢链接
  • @aprogrammer,我说 GUI,而不是面板,必须是可见的。默认情况下,所有的摆动组件都是可见的,除了 JFrame、JDialog、JWindow 等顶级容器。
  • 好的,我尝试了键绑定,这就是我在构造函数中输入的内容:AbstractAction test = new AbstractAction() { public void actionPerformed(ActionEvent e) { System.out.println("It worked!"); } }; getInputMap().put(KeyStroke.getKeyStroke("I"), "test"); getActionMap().put("test", test); 并没有发生任何事情
  • 面板仍然没有焦点(除非您按照我上面的建议解决了问题)。您使用了错误的 InputMap。默认 InputMap 用于组件具有焦点时。您需要使用其他两个 InputMap 之一。如果其他两个 InputMap 都不起作用,那么您需要确保面板具有焦点,因为您可能没有向面板添加任何子组件,在这种情况下,您可以返回使用默认 InputMap。我无法给出确切的答案,因为我没有关于您的 GUI 外观的详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 2015-06-17
  • 2018-07-07
相关资源
最近更新 更多