gpt4 book ai didi

java - 为什么第一次移动时我的 java gui 是 "jump"?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:27 26 4
gpt4 key购买 nike

我有一个简单的 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();
}

}

我在 GNU Linux with java 1.6 上运行。我正在将显示导出回我的 Windows 机器并想知道它是否与 X11 转发有关,因为当我在 Windows 中运行 gui 时它没有显示此行为。但是,当我在 Fedora Linux 机器(带有 java 1.7)上运行这个 gui 时,它根本没有显示这种行为——无论是否导出显示。

最佳答案

有几个问题很明显:

  • 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);
}
});
}
}

关于java - 为什么第一次移动时我的 java gui 是 "jump"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13406549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com