[英]Why does my java gui “jump” when moving it the first time?
我有一个简单的Java gui(下面的代码),由于某些原因,当我显示它时,它将在我第一次尝试移动或调整大小时“跳回”它的原始位置。 因此,基本上,我将必须两次移动gui才能使其移动一次,因为在我第一次释放鼠标时,它就立即回到原始位置。
import javax.swing.*;
public class JFrameTester {
public static void main(String[] args) {
JFrame f = new JFrame("A JFrame");
f.setSize(250, 250);
f.setLocation(300,200);
f.getContentPane().add(new JTextArea(10, 40));
//f.pack();
f.setVisible(true);
//f.validate();
}
}
我在带有Java 1.6的GNU Linux上运行。 我将显示器导出回Windows计算机,并想知道它是否与X11转发有关,因为在Windows中运行gui时,它不显示此行为。 但是,当我在Fedora Linux盒(带有Java 1.7)上运行此gui时,它根本不显示此行为-是否导出显示。
有几个问题很明显:
仅在事件分发线程上构造和操作Swing GUI对象。 否则,可能会导致竞态条件变得模糊,直到其他平台或网络延迟将其暴露出来为止。
使用pack()
,它“使此Window
大小适合其子组件的首选大小和布局。” 否则,无效的Container
将在移动或调整大小时得到验证。 当过早可见的组件移动到定义的位置时,它们似乎“跳跃”。
将setVisible()
作为影响初始外观的最后一个操作。
以下示例结合了这些建议:
import java.awt.EventQueue;
import javax.swing.*;
public class JFrameTester {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame("A JFrame");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new JScrollPane(new JTextArea(10, 40)));
f.pack();
f.setLocationByPlatform(true);
f.setVisible(true);
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.