我创建两个对话框:
DialogA:setVisible(true)
仅调用一次。
DialogB:每1.5秒调用一次setVisible(true)
和setAlwaysOnTop(true)
Windows:每次对dialogB.setAlwaysOnTop(true)
的调用都将dialogA AND dialogB置于最前面。
OSX:每次对dialogB.setAlwaysOnTop(true)的调用都只将dialogB置于最前面。 (预期的行为)
测试用例(Windows):
1我从IDE启动应用程序。
2我看到了DialogA。
3我在IDE中单击,然后DialogA消失。
4一秒钟后,将显示DialogA和DialogB。
5我在IDE中单击,然后DialogA和DialogB消失。转到4
预期的行为(OSX):
4.一秒钟后,将显示DialogB。
5.我在IDE中单击,然后DialogB消失。转到4
题:
如何在Windows下获得预期的行为?
import javax.swing.JDialog;
import javax.swing.JLabel;
public class JDialogSetAlwaysonTopTEST
{
public static void main(String[] p_Strings)
{
final JDialog dialogA = new JDialog();
dialogA.setLocation(0, 0);
dialogA.add(new JLabel("DialogA: Click on the overlapped window"));
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
dialogA.pack();
dialogA.setVisible(true);
}
});
try {Thread.sleep(3000);} catch (InterruptedException e){}
final JDialog dialogB = new JDialog();
dialogB.setLocation(70, 70);
dialogB.add(new JLabel("DialogB: Do you see DialogA?"));
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
dialogB.pack();
dialogB.setVisible(true);
}
});
while(true)
{
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
dialogB.setAlwaysOnTop(true); //prerequisite
dialogB.setVisible(true);
dialogB.setAlwaysOnTop(false); //prerequisite
}
});
try {Thread.sleep(1500);} catch (InterruptedException e){}
}
}
}
最佳答案
我找到了解决问题的“肮脏”方法。
final JDialog dialogA = new JDialog(new JFrame());
...
final JDialog dialogB = new JDialog(new JFrame());
如果每个对话框都有一个独立的所有者dialogB.setAlwaysOnTop(true),则dialogB.setVisible(true)不会影响dialogA