我想编写一个搜索某些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,但它仅适用于帧类。第二个问题是,如果搜索正在进行,我无法在程序中执行任何操作,并且在搜索完成后会看到来自帧类的文本。我希望在找到它之后立即看到文本,就像在控制台中工作一样,我希望有可能在搜索结束之前单击此链接(我还没有实现可点击的链接,也不知道如何做到这一点)。我认为我必须同步进程,但我不知道如何做到这一点。
答案 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
。