web-dev-qa-db-ja.com

処理が発生したときにJTextAreaを動的に更新しますか?

バックグラウンドで処理が行われるときにJTextAreaを介して画面に情報を記録する非常にシンプルなSwing UIを作成しようとしています。ユーザーがボタンをクリックすると、次の呼び出しが必要になります。

textArea.append(someString + "\n");

すぐにUIに表示されます。

現時点では、ボタンをクリックして処理が完了するまで、JTextAreaはすべてのログ情報を表示しません。どうすれば動的に更新できますか?

23
digiarnie

アプリケーションで同じ問題が発生しました。いくつかのアクションを実行し、結果を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に追加されると、常に下にスクロールします。

24
Ascalonian

これを試して:

jTextArea.update(jTextArea.getGraphics());
41
petr

他の人が言ったように、これにはマルチスレッドが必要です。 Swingの並行性 を見てください。

1つの解決策は、SwingWorkerを使用して処理を実装することです。 doInBackgroundメソッドは処理を実装し、Stringを引数として追加してpublishメソッドを呼び出します。次にSwingWorkerは、プロセスメソッドをオーバーライドして文字列引数を取り、それをテキスト領域に追加します。

4
Mark

4年前に投稿されたこの質問に返信して申し訳ありませんが、私に役立つ別の解決策があります。私はポインタを使用してJTextAreaasなどを更新しました:

//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();
1
collielimabean

これにはマルチスレッドが必要です。思い切って準備はいいですか?

0
Spencer Ruport

マルチスレッドの場合は、これを試してみてください! http://www.devarticles.com/c/a/Java/Multithreading-in-Java/

0
binarycreations