非Java应用程序完成后重新获得焦点

非Java应用程序完成后重新获得焦点,java,macos,desktop,Java,Macos,Desktop,我的OSX独立Java程序使用 Desktop.getDesktop().open(f); // Run the Tutorial.pdf file 运行客户端的默认PDF阅读器并显示文件。读取器完成,控制权返回给调用的Java程序。但是,Java程序没有重点。客户端必须单击它才能获得焦点。Java程序有没有办法重新获得焦点?我试过几种方法,但都与程序组件的焦点有关,而不是程序本身 要激活应用程序窗口,请使用: myFrame.toFront(); 请确保包装它,使其在EDT上运行,例

我的OSX独立Java程序使用

Desktop.getDesktop().open(f);    // Run the Tutorial.pdf file

运行客户端的默认PDF阅读器并显示文件。读取器完成,控制权返回给调用的Java程序。但是,Java程序没有重点。客户端必须单击它才能获得焦点。Java程序有没有办法重新获得焦点?我试过几种方法,但都与程序组件的焦点有关,而不是程序本身

要激活应用程序窗口,请使用:

myFrame.toFront();
请确保包装它,使其在EDT上运行,例如
SwingUtilities.invokeLater()

如果出于某种原因,这不起作用,您可以尝试:

myFrame.setAlwaysOnTop(true);
myFrame.setAlwaysOnTop(false);
如果仍然不起作用,你可以试试AppleScript

public class Test extends JFrame {

    public Test() {
        setSize(100, 100);
        setVisible(true);
    }



    public static void main(final String[] args) {
        final Timer timer = new Timer();

        final Test test = new Test();

        final TimerTask timerTask = new TimerTask() {

            @Override
            public void run() {
                test.bringToFront();
            }
        };

        timer.schedule(timerTask, 5000, 5000);
    }



    private void bringToFront() {
        final ScriptEngineManager mgr = new ScriptEngineManager();
        final ScriptEngine engine = mgr.getEngineByName("AppleScript");

        try {
            engine.eval("tell me to activate");
        } catch (final ScriptException ex) {
            ex.printStackTrace();
        }
    }
}

不幸的是,你的建议是我尝试过的几种没有效果的建议之一。你的AppleScript解决方案在一般情况下效果很好。在我的特定情况下,教程PDF文件是交互式的(可变持续时间),因此我无法设置“bringToFront”timerTask以在Reader应用程序完成时激活。不过,谢谢你的帮助。