OK、ウェブ全体で検索を読みましたが、問題の解決策をまだ見つけていません。おそらく単純なものが欠けているため、ここにいます...
修理事業の作業指示を処理するかなり大規模なプロジェクトがあります。それはすべてデータベースに接続されており、多くのページのコードとクラスです。しかし、基本的にノート領域で新しいメッセージをチェックする短いコードをフロント エンドに追加しただけです。
とにかく、2 つのJLabelを持つ単純なJFrameを表示し、別のスレッドがデータベースにクエリを実行します。これはすべて、プログラムの開始時に発生します。問題は、私の小さな「お待ちください」JFrameがフレームを表示しますが、待機中 (データベーススレッドではなく、プログラムの残りのロードです)、ガッツもバックグラウンドもJLabelも表示されないことです。しかし、それまでにはその要点がありません。
以下のサンプルプログラムを書きました。単純なJFrame (CheckingMessagesGUI: 2 つのJLabelを持つJFrame、それ以上のものは何もない) を表示し、5 秒間スリープしてから、サンプル (メイン プログラム) JFrameを表示し、この例では即座に閉じます ( )。もっとたくさん。私が見つけたのは、それが問題を引き起こしているようだということです。スリープタイマーが切れるとウィンドウが表示されますが、それを表示するコードはコマンドの前に与えられており、その順序で実行する必要がありましたか?System.exit(0)
invokeLater
Thread.sleep
私の質問は、なぜJFrameinvokeLater
が正しく表示されないのですか?
その目的はinvokeLater
、項目が正しい AWT イベント スレッドで実行されるようにすることであると理解しています。これにより、このウィンドウが正しく描画されると思います。とにかく、明らかな何かが欠けていると確信しています。以下のコードの一部をコメントアウトしましたinvokeLater
が、正しく実行されますが、元に戻すと...
よろしくお願いします。
package javaapplication6;
public class Example extends javax.swing.JFrame {
public Example() {
System.out.println("Example started");
setBounds(100,100,200,200);
System.out.println("cmGUI instantiated");
CheckingMessagesGUI cmGUI = new CheckingMessagesGUI();
System.out.println("Set cmGUI visible");
cmGUI.setVisible(true);
cmGUI.validate();
try {
System.out.println("timer started");
Thread.sleep(5000);
System.out.println("timer done");
} catch(InterruptedException e){
}
System.exit(0);
}
public static void main(String[] args) {
/*java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() { */
System.out.println("Started");
System.out.println("example Instantiated");
Example example = new Example();
System.out.println("example visible");
example.setVisible(true);
/* }
});
*/
}
}
更新: 明確にするために、Thread.sleep()
すべてをブロックすることを認識していますが、スリープを呼び出す前に CheckingMessagesGUI が既に完全に描画されているべきではありませんか? それが問題です。