Java 专注于JPanel
我在Java 专注于JPanel,java,swing,focus,jpanel,Java,Swing,Focus,Jpanel,我在JFrame中有一个JPanel。我已经注册了一个keylister,我想根据它更新JPanel。我遇到的问题是,我无法将注意力集中在JPanel上,因此我的KeyListener无法工作。我已经知道keylister是功能性的,因为我在JFrame中注册了它,它工作得很好。目前我的代码是这样的: myFrame.setFocusable(false); myPanel.setFocusable(true); myPanel.addKeyListener(myKL); myFrame.add
JFrame
中有一个JPanel
。我已经注册了一个keylister
,我想根据它更新JPanel
。我遇到的问题是,我无法将注意力集中在JPanel
上,因此我的KeyListener
无法工作。我已经知道keylister
是功能性的,因为我在JFrame
中注册了它,它工作得很好。目前我的代码是这样的:
myFrame.setFocusable(false);
myPanel.setFocusable(true);
myPanel.addKeyListener(myKL);
myFrame.add(myPanel);
以前有人遇到过这样的问题吗?在这方面我有什么遗漏吗
注:我在
JPanel中没有任何组件,我只是在背景上画了一个图像,所以我需要聚焦在JPanel本身,而不是它内部的某个东西上。尽管你表示面板可以聚焦,但面板并没有要求聚焦。尝试使用myPanel.requestFocus()代码>我有时会遇到类似的问题。我注意到,在某些情况下,最好在框架内的面板(例如,希望键盘输入进入的输入框)内的特定控件上设置或请求焦点,而不是为面板本身请求焦点 试试看
panel.setFocusable(true);
panel.setRequestFocusEnabled(true);
// some code here
panel.grabFocus();
使用setFocusable(true)
然后使用requestFocusInWindow()
。但后者必须在包含面板的窗口可见后执行,为此,您可能需要注册一个窗口侦听器,并在窗口激活的处理程序代码中执行requestFocusInWindow()
注意:特别是在窗口可见之后,而不仅仅是在调用setVisible(true)
之后,请尝试以下操作:
myFrame.addFocusListener(new FocusAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void focusGained(FocusEvent aE) {
myPanel.requestFocusInWindow();
}
});
谢谢你的回答。尝试了requestFocus()和requestFocusInWindow(),两者都不能使面板获得焦点。你还有其他建议吗?这可能取决于你什么时候打电话。例如,不要在JPanel的构造函数中调用它,因为它在面板显示之前被调用。谢谢David,这个答案对我很有效,我不知道我不能从构造函数中调用它。当我将requestFocus()移动到一个在屏幕上显示后被调用的方法时,它就工作得很好。嗯,添加myPanel.requestFocus()对我来说很有效。您运行的是哪一版本的Java?可能会发布一个SSCCE(简单的自包含可编译示例)来重现这一点。这会给别人一些工作和帮助。通过将问题缩小到最小的范围,我也注意到了w/a问题,有时我自己能够找到解决方案。那么,如果在调用setVisible(true)
后等待时间不够,我的代码如何判断窗口何时可见?对我来说,在调用panel.requestFocusInWindow()时它起作用
在frame.pack()
之后。通常,将Swing命令包装成SwingUtilities.invokeLater(()->{…})代码>,即使您已经在Swing线程上,也可以解决此类问题,因为(文档中说)“这将在处理所有挂起的AWT事件之后发生。”例如:如果您想保护Swing事件代码不导致其自身执行,可以在开始时设置布尔值,然后在结束时重置布尔值,但后者必须位于invokeLater()中,否则重置在事件序列中太早。