0

私は単純な Java GUI (以下のコード) を持っています。これは、何らかの理由で表示されると、最初に移動またはサイズ変更しようとすると元の位置に「ジャンプ」します。したがって、基本的には、GUI を 2 回動かして 1 回動かす必要があります。これは、最初にマウスを放すとすぐに元の位置に戻るためです。

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 マシンにエクスポートしていますが、Windows で GUI を実行してもこの動作が表示されないため、X11 転送と関係があるかどうか疑問に思っています。ただし、Fedora Linux ボックス (Java 1.7 を使用) でこの GUI を実行すると、ディスプレイをエクスポートするかどうかにかかわらず、この動作はまったく表示されません。

4

1 に答える 1

4

いくつかの問題が明らかです。

  • イベント ディスパッチ スレッド上でのみ、 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);
            }
        });
    }
}
于 2012-11-16T06:56:56.057 に答える