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);
});
}
}
我知道围绕这个问题有很多讨论,但这是不同的。我们有一个 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);
});
}
}