首页 > 解决方案 > 不关注 macOS 的 Java JDialog 交互

问题描述

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

-Dglass.taskbarApplication=false

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

标签: javamacosswingfocusjdialog

解决方案


注意:以下解决方案仅在 OS X 上测试

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

dialog.setType(Window.Type.POPUP);

这允许对话框获得焦点,当它获得焦点时,其他窗口不会失去焦点,如弹出菜单。但是,它还有其他效果,例如使对话框的行为就像dialog.setAlwaysOnTop(true)已被调用一样。

注意:下面的示例应用程序在启动时使其他窗口不聚焦,但在未聚焦的窗口再次聚焦后不会聚焦。

例子:

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);
        });
    }

}

推荐阅读