【发布时间】:2012-02-14 06:14:34
【问题描述】:
我创建了两个对话框:
DialogA:setVisible(true) 只调用了一次。
DialogB:setVisible(true) 和 setAlwaysOnTop(true) 每 1.5 秒调用一次
Windows:每次调用 dialogB.setAlwaysOnTop(true) 都会将 dialogA 和 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){}
}
}
}
【问题讨论】:
-
不知道这是否会有所作为,但您可以从尊重 Swing 的线程策略开始,并且只使用 EDT 中的 Swing 组件。
-
您仍在主线程中创建和修改摆动组件。除了睡觉之外的所有事情都必须在 EDT 上完成。
-
你是对的!但结果还是一样。
-
@JBNizet:考虑到 EDT [link]java.sun.com/products/jfc/tsc/articles/threads/threads1.html,我认为代码还可以
-
不,不是。阅读docs.oracle.com/javase/6/docs/api/javax/swing/…。您链接到的文章可以追溯到 1998 年,并且已过时。