Java JDialog交互没有关注macOS

时间:2018-05-29 18:21:43

标签: java macos swing focus jdialog

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

-Dglass.taskbarApplication=false

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

1 个答案:

答案 0 :(得分:2)

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

强制JDialog的{​​{3}}类型如下所示似乎有效。

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

}