Java Swing:从其他应用程序中窃取焦点(在OS X中的可用性)

Java Swing:从其他应用程序中窃取焦点(在OS X中的可用性),java,macos,swing,system-tray,info.plist,Java,Macos,Swing,System Tray,Info.plist,我在javaswing中有一个应用程序,它大部分时间都在系统托盘中运行。用户可以使用托盘菜单执行多个操作。其中一个操作是显示应用程序窗口。我的问题是OSX的可用性 在windows中,如果用户打开应用程序窗口,然后切换到另一个应用程序,他们可以使用任务栏切换回我的应用程序。但在OSX中,应用程序运行的模式是,应用程序没有菜单,也不会出现在Command+Tab列表中 \uuuu LSUIElement在info.plist文件中设置为true 因此,我的问题是,如果用户打开应用程序窗口,然后切换

我在
javaswing
中有一个应用程序,它大部分时间都在系统托盘中运行。用户可以使用
托盘菜单
执行多个操作。其中一个操作是显示应用程序窗口。我的问题是OSX的可用性

在windows中,如果用户打开应用程序窗口,然后切换到另一个应用程序,他们可以使用任务栏切换回我的应用程序。但在OSX中,应用程序运行的模式是,应用程序没有菜单,也不会出现在
Command+Tab
列表中

\uuuu LSUIElement
info.plist文件中设置为true

因此,我的问题是,如果用户打开应用程序窗口,然后切换到另一个应用程序,除非他们单击窗口本身(可能在许多其他窗口后面),否则无法切换回。最简单的方法是用户使用托盘图标再次打开窗口,但由于窗口已经打开,我无法将其带到前面

那么,我如何将注意力从其他应用程序转移到前台呢

编辑:


我的问题不是让“应用程序作为代理运行”。我已经有工作了。我的问题是在创建程序窗口时将其置于顶部。我无法在java中执行此操作。

当用户单击菜单栏中的图标时(或以打开窗口的方式),可以使用
true
参数调用。不过,您必须从Java连接Cocoa。

下面问题的答案中提供的代码实现了这一点


在做了很多同样的事情后,我发现以下是最简单的解决方案:

try {
    String[] cmd = new String[2];
    cmd[0] = "open";
    cmd[1] = "/Applications/MyApp.app";

    Runtime.getRuntime().exec(cmd);
}
catch(Exception ex) {
    //ignore since there's nothing else that can be done
}
本质上,我选择通过JVM执行另一个进程,该进程使用Mac OS X上的“open”命令打开包装创建托盘图标的java程序的应用程序。告诉它自己再次打开会导致窗口被带到前面,因为它已经在运行