2012-02-10 9 views
3

My Swingアプリケーションは、JButtonを押すと、JScrollPane内のJTextPaneにテキスト行を出力します。迅速な操作のために問題はありません。ただし、一部のJButtonでは、操作に数分かかることがあります。この間、ボタンはグレー表示のままです。JTextPane liveness

現時点では、テキストが「バッチアップ」され、その後、ボタンがグレー表示になっている同じ瞬間に、操作の最後に一度に何百行も表示されます。問題は、JTextPaneに表示されるドキュメントに追加されるテキストを、操作が完了した時点ではなく、早く(追加された瞬間に)表示することです。これにより、ユーザーエクスペリエンスが向上します。

私は間違っていますか?

+1

UIスレッドで非UI関連の計算を実行しています。 Oracleのチュートリアルで説明されているように 'SwingWorker'を使って修正できます:http://java.sun.com/developer/technicalArticles/javase/swingworker/ –

答えて

2

バックグラウンド操作を実行する場合はSwingWorkerを使用してください。

// Your button handler 
public void actionPerformed(ActionEvent e) { 
    (new SwingWorker<Void, String>() { 
    public Void doInBackground() { 
     // perform your operation 
     // invoke publish("your string"); 
    } 

    protected void process(List<String> chunks) { 
     // append your string to the scroll pane 
    } 
    }).execute(); 
} 
1

すべてのイベントをブロックするAWTスレッド内から直接コードを呼び出しています。解決方法は、長期実行コードを別のThreadに入れることです。あなたのコードが実行され、結果が得られると、あなたはあなたのビューを観察します(オブザーバ/観測可能なパターンを使用します)。ビューが通知されると、スクロールペインのコンテンツを更新します。

また、AWTスレッドで実行しているかどうかを確認する必要があります(SwingUtilities.isEventDispatchThread())。そうでない場合は、Swingがスレッドセーフではないため、SwingUtilities.invokeLater()を使用してAWTスレッドのビューの更新をディスパッチする必要があります。