2012-02-16 80 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