我有一个简单的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)时,它根本不会显示这种行为 - 无论是否导出显示。
答案 0 :(得分:4)
有几个问题显而易见:
在event dispatch thread上构建和操作仅的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);
}
});
}
}