java - 不关注 macOS 的 Java JDialog 交互
问题描述
我知道围绕这个问题有很多讨论,但这是不同的。我们有一个 java 应用程序,它在 Windows 上的键盘事件上显示一个 JDialog(本机挂钩)。它工作正常,当我在 java 窗口中单击某些内容时,当前应用程序的焦点不会丢失。在 macOS 上,它将活动应用程序更改为我的 java 窗口。我设法用这个隐藏了停靠图标:
-Dglass.taskbarApplication=false
但这还不够,我希望我的 java 应用程序永远不会被关注。我阅读了有关无头属性的信息,但由于我显示了 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);
});
}
}
推荐阅读
- cmake - 编译 Cartographer CMake 错误找不到包配置... cartographer_ros_msgsConfig.cmake
- javascript - Webpack 从不同的块导入模块,而不是同一块中可用的最新版本
- linux - 打开已打开配置文件的新 Firefox 窗口 | 重击,Linux
- azure-devops - 如何在 Azure devops 管道中的 yaml 任务上指定 Cake.Tool 版本
- dji-sdk - 虚拟棒必须执行任务吗?
- python - Python - sqlalchemy.exc.ProgrammingError: (psycopg2.errors.InvalidForeignKey) 没有唯一约束匹配给定键的引用表
- flutter - 如何使用图像拇指创建一个范围滑块,该滑块动画到 Flutter 中按钮点击的某个位置?
- unity3d - Html 敏捷包和 Unity
- javascript - redux thunk 如何调用 curried 异步 thunk 函数?
- asciidoc - 如何将 asciidoc 属性转换为文档