【发布时间】:2010-03-10 17:15:18
【问题描述】:
我遇到了一个问题,当我的框架显示时(在登录对话框之后),按钮的位置不正确,然后在几毫秒后它们会转到正确的位置(带有边框布局的面板的中心)。
--更新
在我的机器上,这个 SSCCE 在我运行它的 10 次中有 2 次显示布局问题:
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TEST {
public static void main(String[] args) throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
System.out.println("Debug test...");
JPanel btnPnl = new JPanel();
btnPnl.add(new JButton("TEST"));
JFrame f = new JFrame("TEST");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().setLayout(new BorderLayout());
f.getContentPane().add(btnPnl);
f.setPreferredSize(new Dimension(800, 600));
f.pack();
f.setExtendedState(JFrame.MAXIMIZED_BOTH);
f.setVisible(true);
System.out.println("End debug test!");
}
});
}
}
按钮首先出现在左上角,然后到中心。是java的bug吗?
--更新
看起来 SSCCE 并没有向所有正在尝试的人显示问题。 可能是我的电脑性能问题。我仍然认为 Java Swing 正在创建新线程以在幕后进行布局。但我不确定。
--更新
这个问题只发生在 f.setExtendedState(JFrame.MAXIMIZED_BOTH);
【问题讨论】:
-
顺便说一下,Swing 教程中的所有示例都使用了 invokeLater,而不是 invokeAndWait。虽然我怀疑这是问题所在,但我只是想知道为什么您不遵循示例中的代码,您不太可能遇到问题。
-
@camickr:有趣的是,invokeAndWait 似乎没有在等待。我修改了他的 SSCCE 以循环整个主窗口,它一次打开多个窗口。
-
可能在 Swing 代码中它正在创建新线程..
-
您在什么 JVM 和平台上看到了这种行为?
-
@Devon_C_Miler 在 Windows 和 Ubuntu 的最后一个 JVM 上。
标签: java user-interface swing layout rendering