【问题标题】:Java keyListener with multiple JPanel具有多个 JPanel 的 Java keyListener
【发布时间】:2013-06-13 17:57:20
【问题描述】:

我在添加另一个 JPanel 和 5 JLabels 时遇到了 Java KeyListener 的问题,我在这个网站上进行了搜索,这个问题的大多数解决方案都涉及从 KeyListener 切换到 @987654325 @。这对我不起作用,因为我需要确切知道何时按下、释放和按住某个键。据我所知,KeyBindings 并未提供所有这些。

我尝试过使用

this.requestFocus();

在创建新的JPanel 之后,但它不起作用,但是当我在paintComponent() 中使用同一行时,它起作用了。这让我想到了我的问题:这如何反映性能?我的paintComponent() 被调用大约 60 次/秒。有没有办法调用它一次并且仍然可以正常工作?我看到JComponent 类型中的requestDefaultFocus() 已被弃用...

我也尝试将相同的 KeyListener 添加到第二个 JPanel,但这没有帮助。我猜其中一个 JLabels 是引起关注的那个?

【问题讨论】:

    标签: java swing jpanel keylistener key-bindings


    【解决方案1】:

    这对我不起作用,因为我需要确切知道何时按下、释放和按住某个键。据我所知,KeyBindings 并没有提供所有这些。

    是的。你有一个“按下”和“释放”的动作。没有像“按住”这样的操作(即使对于 KeyListener),您只会生成多个事件。

    this.requestFocus();
    

    这不是用于请求关注组件的正确方法。阅读该方法的 API,它会告诉您使用的正确方法。

    但是,当我在paintComponent() 中使用同一行时,它可以工作。

    这是因为在实现框架之前您不能请求对组件的关注,这意味着您已经在框架上调用了 pack() 或 setVisible()。

    有没有办法调用它一次并且仍然可以正常工作?

    查看Dialog Focus 中的RequestFocusListener 类。

    正确的解决方案是使用键绑定,因此您不需要使用这些变通方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      • 2012-01-01
      • 2014-05-06
      相关资源
      最近更新 更多