首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setFocusable在java中的使用

setFocusable在java中的使用
EN

Stack Overflow用户
提问于 2015-04-20 20:45:13
回答 4查看 8.4K关注 0票数 1

我已经创建了类start,当按下右箭头键时,一个矩形块将会移动。但此代码仅在添加setFocusable(true)时有效。我阅读了Java Doc,以及之前的许多Stack Overflow问题,但我仍然不知道为什么setFocusable如此重要。请回答我解释这个代码只。

代码语言:javascript
复制
public class start extends JPanel{

    int x=0, xa=1;

    public start() {

        addKeyListener(new KeyListener(){

            public void keyPressed(KeyEvent ke){

                if(ke.getKeyCode()==KeyEvent.VK_RIGHT){

                    xa=xa+1;

                    repaint();

                }
            }

            public void keyTyped(KeyEvent ke){}

            public void keyReleased(KeyEvent ke){}

        });

        setFocusable(true);

    }

    public void paint(Graphics g){

        super.paint(g);

        g.fillRect(x+xa,100,40,50);

    }

}
EN

回答 4

Stack Overflow用户

发布于 2015-04-21 00:38:20

,但我仍然不知道为什么setFocusable如此重要。

事件仅调度到具有焦点的组件。所以你的KeyEvent只有在它是“可聚焦的”并且有焦点的时候才会被分派到面板上。

有关此主题的详细信息,请参阅Motion Using the Keyboard,其中包括两种不同的解决方案。

票数 2
EN

Stack Overflow用户

发布于 2015-04-20 22:04:54

当显示一个框架/窗口时,默认情况下,FocusTraversalPolicy默认组件被赋予焦点。如果组件是可聚焦的并且isFocusTraversableOverridden为真,或者如果它的peer是可聚焦的,则DefaultFocusTraversalPolicy接受该组件。

当调用setFocusable(true)时,标志isFocusTraversableOverridden被设置为FOCUS_TRAVERSABLE_SET,因此这将选出一个componentDefaultFocusTraversalPolicy将其选为默认组件。因此,即使JPanel在默认情况下是可聚焦的,显式调用也会使其被选为默认组件以获得焦点。

无论如何,这不是通过requestFocus连接到Component的正确方式。一旦Component可见,您应该尝试使用requestFocusrequestFocusInWindow

另外,考虑覆盖paintComponent而不是paint

票数 1
EN

Stack Overflow用户

发布于 2015-04-20 20:55:15

focusable标志指示组件是否可以获得焦点。默认情况下,JPanel组件是可聚焦的,因此当您将其设置为true时,将不会有任何更改。此外,setFocusable本身也不会设置焦点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29748284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档