首页 > 解决方案 > 当 Java 不在顶部时,JDialog 不专注于 OSX

问题描述

当 Java 程序不在 OSX 的前面时,我的 JDialog 不集中。我如何实现这一目标?

我有以下测试程序来说明javac Test.java && java Test从终端运行的场景(在底部)。

当终端输出“Started first”时,它会将焦点转移到Java程序上。我通过单击终端(或其他程序)从启动的 Java 程序中移除焦点。显示“第二个测试”文本的第二个 JDialog 将不会被聚焦。即使我设置了也是一样的dialog.setAlwaysOnTop(true);

当我在看到“首先启动”后让 Java 程序保持在顶部时,带有“第二次测试”文本的 JDialog 正确聚焦(即不单击其他地方,以便启动的 Java 程序位于顶部)。

请注意,我的 Java 程序没有 Swing UI。它在后台运行并弹出 JDialog 以获取用户输入。这在 Windows 和 Linux 上都可以正常工作(无论当时关注哪个应用程序,创建的 JDialog 都会被关注)。

public class Test {
    public static void main(String[] args) throws Exception {

        Thread t = new Thread() {
            @Override
            public void run() {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        launch("First test");
                    }
                });
            }
        };
        Thread t2 = new Thread() {
            @Override
            public void run() {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        launch("Second test");
                    }
                });
            }
        };

        t.start();
        System.out.println("Started first");
        Thread.sleep(5000);
        System.out.println("Started second");
        t2.start();
    }

    private static void launch(String title) {
        System.out.println("Showing");
        System.out.println(Thread.currentThread().getName());

        final JDialog dialog = new JDialog(null, "Test", ModalityType.APPLICATION_MODAL);
        dialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        final JTextField searchBar = new JTextField(title);
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.add(searchBar);
        dialog.add(panel);
        dialog.pack();
        dialog.setLocationRelativeTo(null);
        searchBar.requestFocus();
        SwingUtilities.invokeLater(new Runnable() {  
            public void run() { 
                searchBar.requestFocus();
            }
        });
        dialog.setVisible(true);
        System.out.println("Result is " + searchBar.getText());
    }
}

标签: javaswingjdialog

解决方案


推荐阅读