Java同步和在textpane中编写

时间:2012-02-16 15:53:20

标签: java html swing concurrency jtextpane

我想编写一个搜索某些HTML地址的程序。我假设一次搜索将超过1分钟。当我将结果打印到控制台时,一切正常,但是当我创建一个框架时,结果不会显示在textpane中。现在我有两个要搜索的类和一个用于帧的类。我在frame类中编写了simple函数来检查是否正在添加文本:

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 :(得分:2)

这听起来像是在特殊的Swing事件线程上执行主要下载任务,该线程处理Swing组件的所有工作。这将阻止GUI正确响应。

如果您在事件处理程序中执行长时间操作(例如,当您按下JButton时),则会“偶然”发生这种情况。

您需要在单独的线程中执行长时间运行的任务,然后使用SwingUtilities.invokeLater(runnable)将数据“移交”到Swing线程以更新GUI; 已修改:或查看Max关于SwingWorker的回答。

例如,当您的工作线程准备好一些数据时,您会使用匿名Runnable执行类似的操作:

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

其中getText()仅指示获取下载文本的一些方法,而appendtext()是您需要编写以更新文本窗格的方法。

答案 1 :(得分:1)

结帐SwingWorker。它应该可以帮助您处理冗长的操作和管理中间结果。本手册中有一个示例,说明如何使用publish()process()方法将中间文本结果附加到JTextArea