Java JDialog 交互,无需关注 macOS

标签 java macos swing focus jdialog

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

-Dglass.taskbarApplication=false

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

最佳答案

注意:以下解决方案仅在 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);
        });
    }

}

关于Java JDialog 交互,无需关注 macOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50590633/

相关文章:

java - 使用 Iterable 的类的多个迭代器

Java Swing OSX 窗口菜单复选标记

java - 如何使 JFormattedTextField 接受不带小数点(逗号)的整数?

python - 使用 Pandas 读取制表符分隔的文件 - 适用于 Windows,但不适用于 Mac

英特尔 HD 3700 linux 的 Java 8 Swing 渲染问题

java - 需要一个定时的 panel.repaint();

java - MongoTemplate如何在查询中添加两个以上 "orOperator"

java - 如何动态更新信任库?

java - JVMTI Agent_OnLoad 处理程序无法创建系统属性

c# - 同一个库之间的调用不明确?