【问题标题】:Java JDialog interaction without taking focus on macOS不关注 macOS 的 Java JDialog 交互
【发布时间】:2018-05-29 18:21:42
【问题描述】:

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

-Dglass.taskbarApplication=false

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

【问题讨论】:

    标签: java macos swing focus jdialog


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多