【问题标题】:Swing: Steal focus from other apps (usability in OS X)Swing:从其他应用程序中窃取焦点(在 OS X 中的可用性)
【发布时间】:2010-07-28 19:47:44
【问题描述】:

我在java swing 中有一个应用程序,它大部分时间都在系统托盘中运行。用户可以使用Tray Menu 执行多项操作。其中一项操作是显示应用程序窗口。我遇到的问题是 OS X 上的可用性。

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

__LSUIElementinfo.plist file 中设置为true

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

那么,我如何将焦点从其他应用程序中移开并将我的窗口放在前面?

编辑:

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

【问题讨论】:

    标签: java macos swing system-tray info.plist


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      下面问题的答案中提供的代码起到了作用

      How to bring a window to the front?

      【讨论】:

        【解决方案3】:

        在尝试做同样的事情后,我发现以下是对我来说最简单的解决方案:

        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 上的“打开”命令打开包装了创建托盘图标的 java 程序的应用程序。告诉它再次打开它会导致窗口被带到前面,因为它已经在运行了。

        【讨论】:

          猜你喜欢
          • 2012-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多