バックグラウンドで処理が行われるときにJTextAreaを介して画面に情報を記録する非常にシンプルなSwing UIを作成しようとしています。ユーザーがボタンをクリックすると、次の呼び出しが必要になります。
textArea.append(someString + "\n");
すぐにUIに表示されます。
現時点では、ボタンをクリックして処理が完了するまで、JTextAreaはすべてのログ情報を表示しません。どうすれば動的に更新できますか?
アプリケーションで同じ問題が発生しました。いくつかのアクションを実行し、結果をJTextAreaに出力するアプリケーションの「実行」ボタンがありました。スレッドからメソッドを呼び出さなければなりませんでした。これが私がしたことです。
実行できるアクションのラジオボタンがいくつかあり、その特定のアクションを実行するための1つの「実行」ボタンがあります。 Validateというアクションがあります。そのため、そのラジオボタンをチェックして[実行]ボタンをクリックすると、メソッドvalidate()が呼び出されます。だから私は最初にこのメソッドをRunnableを実装した内部クラスに入れました
class ValidateThread implements Runnable {
public void run() {
validate();
}
}
次に、「実行」ボタンのActionListenerでこのスレッドを呼び出しました。
runButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
// Some code checked on some radio buttons
if(radioButton.isSelected()) {
if(radioButton.getText().equals("VALIDATE")) {
Runnable runnable = new ValidateThread();
Thread thread = new Thread(runnable);
thread.start();
}
}
}
});
出来上がり!出力がJTextAreaに送信されます。
これで、JTextAreaがテキストとともにスクロールダウンしないことがわかります。したがって、次のようにキャレットの位置を設定する必要があります
textArea.setCaretPosition(textArea.getText().length() - 1);
これで、データがJTextAreaに追加されると、常に下にスクロールします。
これを試して:
jTextArea.update(jTextArea.getGraphics());
他の人が言ったように、これにはマルチスレッドが必要です。 Swingの並行性 を見てください。
1つの解決策は、SwingWorkerを使用して処理を実装することです。 doInBackgroundメソッドは処理を実装し、Stringを引数として追加してpublishメソッドを呼び出します。次にSwingWorkerは、プロセスメソッドをオーバーライドして文字列引数を取り、それをテキスト領域に追加します。
4年前に投稿されたこの質問に返信して申し訳ありませんが、私に役立つ別の解決策があります。私はポインタを使用してJTextArea
asなどを更新しました:
//JScrollPane variable pane initialized with JTextArea area
//We will update area with new text
JTextArea temp = (JTextArea) pane.getViewPort().getView();
//new text to add
JTextArea c = new JTextArea();
c.append("text \n)";
//update through pointers
temp = c;
pane.validate();
これにはマルチスレッドが必要です。思い切って準備はいいですか?
マルチスレッドの場合は、これを試してみてください! http://www.devarticles.com/c/a/Java/Multithreading-in-Java/