4

シンプルなSwingGUIがあります。(これだけでなく、私が書いたすべてのスイングGUI)。実行すると、メインフレームのサイズを変更するまで、空白の画面以外は何も表示されないため、すべてのコンポーネントが再度ペイントされ、表示できます。

これが私の簡単なコードです:

public static void main(String[] args) {
        JFrame frame = new JFrame("JScroll Pane Test");
        frame.setVisible(true);
        frame.setSize(new Dimension(800, 600));

        JTextArea txtNotes = new JTextArea();
        txtNotes.setText("Hello World");
        JScrollPane scrollPane = new JScrollPane(txtNotes);
        frame.add(scrollPane);
}

したがって、私の質問は、このクラスを開始すると、フレームのサイズを変更するまで、追加したすべてのコンポーネントがフレームに表示されるようにする方法です。

ありがとう :)

4

2 に答える 2

13
  • JFrameが表示された後にコンポーネントを追加しないでくださいJFramesetVisible(true)

  • setSize()フレームを呼び出すのはあまり良い習慣ではなくpack()JFrameサブコンポーネントの推奨サイズとレイアウトに合うようにサイズ設定されるため)LayoutManager、サイズを処理します。

  • EDT(Event-Dispatch-Thread)を使用する

  • JFrame#setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)@Gilbert Le Blanc(彼に+1)が言ったように電話してください。そうしないと、EDT/初期スレッドは閉じJFrameられた後もアクティブなままになります

そのようです:

public static void main(String[] args) {
        //Create GUI on EDT Thread
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {

                  JFrame frame = new JFrame("JScroll Pane Test");
                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

                  JTextArea txtNotes = new JTextArea();
                  txtNotes.setText("Hello World");
                  JScrollPane scrollPane = new JScrollPane(txtNotes);
                  frame.add(scrollPane);//add components

                  frame.pack();
                  frame.setVisible(true);//show (after adding components)
            }
        });
}
于 2012-10-03T17:21:36.643 に答える
5

あなたの単純なコードにはいくつかの点が欠けています。

SwingUtilitiesSwingコンポーネントをイベントディスパッチスレッドに配置するには、を呼び出す必要があります。

を呼び出す必要がありsetDefaultCloseOperationますJFrame

JFrameメソッドを正しい順序で呼び出す必要があります。setSizeorpackメソッドが呼び出され、次にメソッドsetVisibleが最後に呼び出されます。

public class SimpleFrame implements Runnable {

    @Override
    public void run() {
        JFrame frame = new JFrame("JScroll Pane Test");

        JTextArea txtNotes = new JTextArea();
        txtNotes.setText("Hello World");
        JScrollPane scrollPane = new JScrollPane(txtNotes);
        frame.add(scrollPane);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
        frame.setSize(new Dimension(800, 600));
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new SimpleFrame());
    }

}
于 2012-10-03T17:26:46.690 に答える