Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 专注于JPanel_Java_Swing_Focus_Jpanel - Fatal编程技术网

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()中,否则重置在事件序列中太早。