1

JTextArea オブジェクトを含む JScrollPane があります。この特定のアプリケーションでは、JTextArea が「プロセス コンソール」として機能しているため、誰かが長期実行プロセスで何が起こっているかを確認できます。私のコードは次のようになります。

JTextArea console;

...

// Initializes the console panel, including creation of the JTextArea and JScrollPane
private void initializePanel() {
    JPanel consolePanel = new JPanel();
    ...
    console = new JTextArea();
    console.setEnabled(false);
    textAreaScrollPane = new JScrollPane(console);
    ...
}

// Appends an incoming message to the console
@Override
public void update(Observable observable, Object consoleMessage) {
    console.append(consoleMessage + "\n");
    console.update(console.getGraphics());
}

私が直面している問題は、私の JScrollPane がスクロール バーで始まらないことです。基礎となる JTextArea にテキストが追加されると、JScrollPane の下部からはみ出します。残念ながら、長時間実行されるプロセスが完了するまで、スクロール バーは表示されません。その時点で、スクロール バーが突然表示され、ビューが JTextArea の最後にジャンプします。

そのため、さらにメッセージが JScrollPane の現在のビューポートの外にあるため、アプリケーションはフリーズしているように見えます。

メッセージが書き込まれるたびに JSrollPane を再描画するために、さまざまなコードの組み合わせを試しましたが、そのような運はありませんでした。JTextArea はメッセージを取得し、メッセージを受け取るとすぐに出力します。実際に問題となっているのは、JScrollPane がスクロール バーをすぐに追加しないことです。

ありがとう。

4

1 に答える 1

1

Mrpyoさんのコメントは的を射ていました。長時間実行されるプロセスを実行するために (SwingWorker を使用して) 2 番目のスレッドを生成し、ユーザー スレッドを解放して UI の更新を実行できるようにしました。

私が追加しなければならなかったことの 1 つは、JScrollPane を常に一番下までスクロールするように強制することでした。私は単に呼び出すことでそれを行いました

console.selectAll(); // console is my JTextArea object

JTextArea オブジェクトが有効になっていないため、selectAll() を呼び出しても実際には何も選択されませんが、JScrollPane を最後までスクロールするという副作用があります。それはエレガントな解決策ではないので、誰かがもっと良いものを持っていれば、私はすべて耳を傾けていますが、うまくいきます。

ありがとう、ムルピョ!

Trashgod によって提供されたリンクは、私をここに導きました:

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html

...これは、この同時実行を正しく行う方法に関する優れたリソースになりました。

于 2012-11-07T22:11:02.787 に答える