2012-02-16 78 views
2

我想編寫一個程序,它搜索一些HTML地址。我假設一個搜索將進行超過1分鐘。當我打印結果來控制一切正常時,但是當我製作一個框架時,結果不會出現在文本窗格中。現在我有兩個類一個搜索和一個框架。我寫的框架類的簡單功能,以檢查是否添加文字工作:Java同步和在textpane中寫入

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); } 
} 

而在二等我寫的同一行addText,但它是從框架類唯一的工作。第二個問題是,如果搜索正在進行,我不能在程序中做任何事情,搜索結束後看到框架類中的文本。我希望看到文本後立即找到它像在控制檯中工作,我想有可能在搜索結束之前單擊此鏈接(我沒有實現可點擊的鏈接,但不知道如何做到這一點)。我認爲我必須同步流程,但我不知道如何去做。

+0

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2012-02-16 18:12:00

回答

2

聽起來好像您正在執行特殊的Swing事件線程的主要下載任務,該線程處理Swing組件的所有工作。這會阻止GUI正確響應。

如果您在事件處理程序中執行了長時間運行的操作(例如,當您按JButton時),則會發生'意外'。

您需要在單獨的線程中執行長時間運行的任務,然後將數據「交給」Swing線程以更新GUI,使用SwingUtilities.invokeLater(runnable); 編輯:或參見Max關於SwingWorker的回答。

例如,你的工作線程會做這樣的事情,當它有一些數據準備好,使用匿名Runnable

final String text = getText(); 
    SwingUtilities.invokeLater(new Runnable() 
    {   
     @Override 
     public void run() 
     { 
      appendText(text);     
     } 
    }); 

其中getText()只是表示取得下載的文本的某些手段,appendtext()是方法,您將需要編寫更新您的文本窗格。

+0

現在感謝程序正在響應,當我正在搜索,但不斷我不能寫搜索類的結果。如果它必須實現可運行?如果是的話,該怎麼做。 – fliker 2012-02-16 16:34:40

+0

我編輯了我的答案以顯示如何使用匿名Runnable。 – DNA 2012-02-16 16:38:45

+0

它全部正常工作,但來自工人類的文本不會出現在TextPane中,儘管它經歷了嘗試並且沒有發現任何異常。 Frame類中的文本出現在TextPane中。我不知道爲什麼它是這樣的 – fliker 2012-02-16 17:24:00

1

結賬SwingWorker。它應該可以幫助您處理冗長的操作並管理中間結果。本手冊中有一個示例說明如何使用publish()process()方法將中間文本結果附加到JTextArea