2012-02-16 8 views
2

いくつかのHTMLアドレスを検索するプログラムを作成したいと思います。私は1つの検索が1分以上かかると仮定します。結果をコンソールに出力すると問題はありませんが、フレームを作成すると結果はテキストペインに表示されません。今私は検索するクラスとフレームのクラスの2つのクラスを持っています。Javaの同期とテキストペインでの書き込み

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
    String Txt=(String)jComboBox1.getSelectedItem(); 
    jTextPane1.setText(""); 
    addText(Txt);  
    SecondClass.find(Txt); 
} 
public void addText(String text){ 
    StyledDocument doc = jTextPane1.getStyledDocument(); 
    try{ 
    doc.insertString(doc.getLength(), text, null); 
    }catch(Exception e) { System.out.println(e); } 
} 

そしてSecondClassに、私はaddTextに同じラインを書き、それがフレームクラスからのみ働いている:私は、テキストの作業を追加する場合は、単純にチェックするために、フレームクラスで機能書きます。 2つ目の問題は、検索が行われている場合、プログラムで何もできず、フレームクラスのテキストが検索が完了した後に表示されることです。私は動作中のコンソールのようなものを見つけた直後にテキストを見たいので、検索が終了する前にこのリンクをクリックする可能性があります(私はまだクリック可能なリンクを実装していないし、これを行う方法も知らない)。私はプロセスを同期させなければならないと思うが、これをどうやって行うのか分からない。

+0

すぐに役立つように、[SSCCE](http://sscce.org/)を投稿してください。 –

答えて

2

Swingコンポーネントのすべての作業を処理する特別なSwingイベントスレッドで主なダウンロードタスクを実行しているようです。これにより、GUIが適切に応答しなくなります。

これは、イベントハンドラ内で長時間実行するアクション(たとえば、JButtonを押すと)を実行すると「偶然」発生します。

別のスレッドで長時間実行するタスクを実行してから、SwingUtilities.invokeLater(runnable)を使用して、Swingスレッドにデータを渡してGUIを更新する必要があります。 編集:またはSwingWorkerに関するMaxの答えをご覧ください。

final String text = getText(); 
    SwingUtilities.invokeLater(new Runnable() 
    {   
     @Override 
     public void run() 
     { 
      appendText(text);     
     } 
    }); 
getText()がちょうどダウンロードしたテキストを取得するいくつかの手段を示し

、およびappendtext()がある:それは準備ができていくつかのデータを持っているとき

はたとえば、あなたのワーカースレッドがRunnable匿名を使用して、このような何かをするだろうメソッドを使用してテキストペインを更新する必要があります。

+0

今、検索しているときにプログラムが応答していますが、絶えず検索クラスから結果を書き込めません。実行可能ファイルを実装する必要がある場合はいの場合、それを行う方法。 – fliker

+0

匿名のRunnableの使い方を示すために私の答えを編集しました。 – DNA

+0

これはすべて動作しますが、tryを実行して例外をキャッチしないにもかかわらず、ワーカークラスのテキストはTextPaneに表示されません。 FrameクラスのテキストがTextPaneに表示されます。私はなぜそれがこのようなものなのか分かりません – fliker

1

チェックアウトSwingWorker。それは、長い操作の処理と中間結果の管理にも役立ちます。このマニュアルには、publish()process()メソッドを使用して中間テキストの結果をJTextAreaに追加するサンプルがあります。

関連する問題