当Java不在顶部时,JDialog没有关注OSX



当Java程序在OSX中不在前面时,我的JDialog不会集中。我该如何做到这一点?

我有下面的测试程序来说明这个场景(在底部(,从终端使用javac Test.java && java Test运行。

当终端输出"Started first"时,它会将焦点更改为Java程序。我通过点击终端(或其他程序(来从启动的Java程序中移除焦点。显示为"第二次测试"文本的第二个JDialog将不会集中显示。即使我设置了dialog.setAlwaysOnTop(true);,这也是一样的

当我看到"Started first"(即不点击其他地方,以便启动的Java程序位于顶部(后,让Java程序保持在顶部时,带有"Second test"文本的JDialog会正确聚焦。

请注意,我的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());
}
}

我最终在这里使用了TT答案。

基本上,这个想法是使用java.awt.Robot移动鼠标并单击弹出对话框以获得焦点。

它在大多数情况下都能工作,但当你有多个屏幕时,鼠标移动会很奇怪,所以需要特殊情况处理。

最新更新