Мой 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());
}
}