0

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

我试过用

this.requestFocus();

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

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

4

1 回答 1

2

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

是的,它确实。你有一个“按下”和“释放”的动作。没有诸如“按住”之类的动作(即使对于 KeyListener),您只会生成多个事件。

this.requestFocus();

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

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

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

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

请参阅Dialog FocusRequestFocusListener中的课程。

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

于 2013-06-13T18:02:11.843 回答