【问题标题】:Why does my java gui "jump" when moving it the first time?为什么我的 java gui 第一次移动时会“跳”?
【发布时间】:2012-11-15 21:28:49
【问题描述】:

我有一个简单的 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 和 java 1.6 上运行。我正在将显示导出回我的 Windows 机器,并想知道它是否与 X11 转发有关,因为当我在 Windows 中运行 gui 时它没有显示这种行为。但是,当我在 Fedora Linux 机器(使用 java 1.7)上运行这个 gui 时,它根本不会显示这种行为 - 无论是否导出显示。

【问题讨论】:

  • 我怀疑 Xserver 在您的 Windows PC 上运行。您能否在 GNU/Linux Java 1.6 机器上运行相同的应用程序,并在另一台(非 Windows)机器上远程显示它?
  • 1) GUI 应该在 EDT 上启动和更新。 2) 始终调用pack() 以使GUI 进行布局和验证。 3) f.setSize(250, 250); 适得其反。根据文本区域所需的行和列设置 GUI 的大小。
  • 另外,在将标签应用于问题之前,请仔细检查标签文本。这与 SO 定义的export没有任何关系
  • @dasrb 我已经尝试过其他机器并得到相同的行为,但是它们都是 Windows

标签: java linux swing user-interface x11


【解决方案1】:

有几个问题很明显:

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

【讨论】:

  • 试过这个程序并寄予厚望,但仍然没有运气:(同样的行为。
  • 您可以编辑您的问题以包含特定版本的 Windows 和 X11;也许有人可以重现您描述的效果。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多