【问题标题】:requestFocus() works on Mac but not on WindowsrequestFocus() 适用于 Mac 但不适用于 Windows
【发布时间】:2012-02-08 22:45:25
【问题描述】:

在我的程序中,我有一个 JTabbedPane 请求焦点来监听一些关键事件,它在我的 mac 上运行良好。但是,当我切换到 Windows 机器时,似乎失去了焦点。无法再监听关键事件。

我在 Windows 中也有 setRequestFocusEnabled(true),而我的 Mac 上不需要。

我该如何解决这个问题?

【问题讨论】:

  • 请提供一个sscce,表明您描述的问题。

标签: java windows macos swing user-interface


【解决方案1】:

requestFocus 不鼓励使用,因为它试图将焦点放在组件的窗口上,这并不总是可行的。在现代 JDK 中,您应该坚持使用 requestFocusInWindow 方法

你试过那个方法吗?

【讨论】:

    【解决方案2】:

    我自己也遇到了这个问题,您需要使用键绑定才能使其正常工作。您将击键绑定到特定操作:)。然后输入图通过字符串键(在我的示例中为“空格”)链接到操作图。 您可以使用匿名的内部 AbstractAction 类,但如果您调用非最终变量,它可能会引发错误。所以在那个类中调用一个扩展 AbstractAction 的新私有类

        JPanel component = (JPanel)frame.getContentPane();
    //THIS IS THE KEY BINDING CODE
            component.getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "space");
            component.getActionMap().put("space", (new AbstractAction(){
                public void actionPerformed(ActionEvent e){
    
                    Timer timer = new Timer();
    
                    timer.scheduleAtFixedRate(new TimerTask(){
                    public void run(){
                            grid.stepGame();
                        }
                    },250, 250);
    
    
    
                }}));
            }
    

    【讨论】:

      【解决方案3】:

      来自requestFocus() 的 JavaDocs:

      请注意,不鼓励使用此方法,因为它的行为取决于平台。我们建议使用requestFocusInWindow(boolean)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多