JDialog не ориентирован на OSX, когда Java не на вершине - PullRequest
0 голосов
/ 03 ноября 2019

Мой JDialog не фокусируется, когда Java-программа не находится впереди в OSX. Как мне этого добиться?

У меня есть следующая тестовая программа для иллюстрации сценария (внизу), работающая с использованием javac Test.java && java Test от терминала.

Когда вывод терминала "Начинается первымmsgstr ", это переключит фокус на программу Java. Я удаляю фокус из запущенной Java-программы, нажимая на терминал (или какую-либо другую программу). Второй JDialog, показанный с текстом «Второй тест», не будет сфокусирован. Это то же самое, даже если я установил dialog.setAlwaysOnTop(true);

JDialog с текстом «Второй тест» правильно фокусируется, когда я покидаю программу Java, оставаясь на вершине после просмотра «Сначала запущен» (т.е. не щелкая где-то еще, такчто запущенная 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());
    }
}
...