繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM