为什么我的Java GUI在第一次移动时会“跳跃”?

我有一个简单的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机器上运行这个gui(用java 1.7)时,根本不显示这个行为 – 不pipe是否导出显示。

Solutions Collecting From Web of "为什么我的Java 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); } }); } }