Java 不关注macOS的JDialog交互

Java JDialog interaction without taking focus on macOS

我知道围绕这个问题有很多讨论,但这是不同的。我们有一个 java 应用程序,它在 Windows(本机挂钩)上的键盘事件上显示 JDialog。它工作正常,当我单击 java window 中的某些内容时,当前应用程序的焦点不会丢失。在 macOS 上,它将活动应用程序更改为我的 java window。我设法用这个隐藏了停靠栏图标:

-Dglass.taskbarApplication=false

但这还不够,我希望我的 java 应用程序永远不会被聚焦。我阅读了有关无头 属性 的信息,但由于我显示了 JDialog,它无法工作。它在 Windows 中完美运行,但在 Mac 中,我猜托盘应用程序不一样。这可能吗?是 JDialog 的问题还是我可以在后台向 运行 我的 java 应用程序添加一些参数?谢谢

注意:下面的解决方案只在OS X上测试过

强制 JDialog 具有如下所示的 Window.Type#POPUP 类型似乎可行。

dialog.setType(Window.Type.POPUP);

这使得对话框可以聚焦,当它获得焦点时,其他 windows 不会失去焦点,就像弹出菜单一样。但是,它还有其他效果,例如使对话框表现得好像 dialog.setAlwaysOnTop(true) 已被调用。

注意: 下面的示例应用程序在启动时取消对其他 windows 的关注,但在未关注的 windows 再次获得关注后不会。

示例:

import java.awt.EventQueue;
import java.awt.Window;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;

public class NonUnfocusingDialogExample {

    public static void main(final String[] args) {
        EventQueue.invokeLater(() -> {
            final JDialog dialog = new JDialog();
            dialog.setType(Window.Type.POPUP);
            dialog.getContentPane().add(new JLabel("Hello World!", 
                    SwingConstants.CENTER));
            dialog.pack();
            dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            dialog.setTitle("Test Dialog");
            dialog.setLocationByPlatform(true);
            dialog.setVisible(true);
        });
    }

}