1

それを実行しているマシン(および)JFrameに関する情報を含むプログラムを作成し、別の情報を表示するために接続します。HOSTIPJDBC

main関数には次の2行しかありません。

NewFrame nf = new NewFrame(); //Here I make all the needed calculations
nf.setVisible(true);

NewFrameはJFrameを拡張します

コンストラクターで、必要なすべての計算を実行し、それらがに表示されるように設定しますnf JFrame

プログラムを実行すると、情報が入力される前に0.5〜1秒間境界線が表示されますが、作成後にのみ表示されるように設定しました。JFrame

これは私が約1秒間見るものです:(内部は私のデスクトップの背景です)

前

そして、私は情報を見ます:

後

コンストラクターですべての計算を行ったのに、なぜこれが発生するのですか?

4

2 に答える 2

5

イベントディスパッチスレッド(EDT)をブロックしているようです

ブロックする可能性がある操作や、EDT で時間がかかる操作は実行しないでください。これにより、EDT が重要な再描画イベントをディスパッチできなくなります。

Concurrency in Swingと、おそらくSwing Workerをご覧になることをお勧めします。

Swing と Threads を扱う際の重要なルールの 1 つは、EDT 内からのみ Swing コンポーネントと対話する必要があることです。

于 2013-02-12T09:53:48.070 に答える
1

GUIスレッドで同期的にブロッキングコール、つまりデータベースクエリを実行しているようです。を使用して、そのようなことを非同期で行う必要がありますSwingWorker

final JTextField field = new JTextField ();
field.setEditable (false);

JButton button = new JButton(new AbstractAction ("Calculate!") {
    @Override
    public void actionPerformed(ActionEvent e) {
        field.setText ("Calculating...");

        new SwingWorker<String, String> ()
        {
            @Override
            protected String doInBackground() throws Exception {
                Thread.sleep(3000L);

                field.setText ("Calculated!");

                return null;
            }
        }.execute();
    }
});

JFrame frame = new JFrame ();
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.getContentPane ().setLayout (new BorderLayout());
frame.getContentPane ().add (button, BorderLayout.NORTH);
frame.getContentPane ().add (field, BorderLayout.CENTER);
frame.pack ();
frame.setVisible (true);
于 2013-02-12T09:53:54.560 に答える