0

ヘルプが必要です。ボタンがクリックされたときに実行されるメソッドがあります。このメソッドは、別のクラスの変数を更新する新しいウィンドウを開き、メソッドはクラスからこの変数を取得して使用します。

ロードされたウィンドウは空白であり、wait()関数が原因で、新しいウィンドウがロードされる前にスレッドが停止しているように見えます。

private void autoFillUsersActionPerformed(java.awt.event.ActionEvent evt) {                                              
    publicLesson pL= new publicLesson();
    new dateSelect().setVisible(true);
    try{
        synchronized(this){
            this.wait();
        }
    }
    catch(Exception e){

    }
  int var= pL.getAmount();
  System.out.println("var ="+var);

    DefaultTableModel defaultModel = (DefaultTableModel) pupilTable.getModel();
    for (int i = 0; i <= (userCountAmount - 1); i++) {
        defaultModel.setValueAt(var, 5, i);
        System.out.println("BeingSet");
    }

}  
4

6 に答える 6

2

はい、そうです。イベント ディスパッチ スレッドを待機すると、スレッドが完全にブロックされ、再描画が行われなくなります。そのため、待機中は EDT は何も描画できません。

イベント ディスパッチ スレッドでは、実行時間の長いタスクやさらに多くのブロック タスクを実行しないでください。wait()ところで、なぜここで使用しているのかはまったく明らかではありません。

そして、例外をキャッチして完全に無視することは、あなたができる最悪のことの 1 つです。

于 2012-07-09T21:05:09.530 に答える
2

Event Dispatch Threadをブロックしています。EDT がwait呼び出しを通過できないようにすることで、イベントを処理できなくなり、何も描画できなくなります。

新しいウィンドウを使用する代わりに、モーダル ダイアログを使用してみてください。モーダル ダイアログは、適切に破棄されるまで、(モダリティの種類に応じて) 他の最上位コンポーネントへのすべてのアクセスをブロックします。

于 2012-07-09T21:05:25.887 に答える
0

いくつかの回答に同意します。try/catch/synchronized ブロックを削除し、javax.swing.JDialog を使用してユーザー入力を受け取ります。公式の Swing ドキュメントを参照してください。十分な例が示されています。つまり、JDialog に関するhttp://docs.oracle.com/javase/tutorial/uiswing/components/dialog.htmlです。

于 2012-07-09T21:23:02.387 に答える
0

Swing は 1 つのスレッドのみで実行されるため、その方法は実行できません。待機後に行っている処理を、作成中のウィンドウに移動する必要があります。待機に依存することはできません。

読むのに適したドキュメントは次のとおりです。

http://www.javapractices.com/topic/TopicAction.do?Id=153

于 2012-07-09T21:04:12.983 に答える
0

wait メソッドは Object() とドキュメントの状態から継承されます

別のスレッドがこのオブジェクトの notify() メソッドまたは notifyAll() メソッドを呼び出すまで、現在のスレッドを待機させます。つまり、このメソッドは、wait(0) の呼び出しを実行するかのように動作します。

したがって、待機する何かを与える必要がありますが、唯一のスレッドをブロックしているため、その間に何かをペイントする方法はありません。

于 2012-07-09T21:06:57.207 に答える
0

ユーザーが必要なデータを別の JFrame に入力するまで、メインの JFrame で待機するのが目的ですか? それがあなたの目的なら、Dialog ModalityTypesを見てください。

http://download.java.net/jdk7/archive/b123/docs/api/java/awt/Dialog.ModalityType.html

新しいダイアログを構築するときは、親ダイアログをパラメータとしてコンストラクタに渡してから呼び出すだけです

super(parentDialog, Dialog.ModalityType.DOCUMENT_MODAL);

その後、メインの JFrame は、残りの関数を実行するまで、新しい JDialog が閉じるのを待ちます。

それが役立つことを願っています。

于 2012-07-09T21:07:55.543 に答える