2015-11-04 57 views
1

我有一个Swing GUI的一个运行按钮用下面的代码更新文本区域摆动的Java

private void runButtonActionPerformed(java.awt.event.ActionEvent evt) { 
    staticLinkTextArea.append("Building Site Map (this can take a while depending on depth) \n"); 
    crawl.CrawlerInit("http://www.asquithnurseries.co.uk/", "asquithnurseries.co.uk",1); 
    crawl.runCrawler(); 
    staticLinkTextArea.append("Building Complete Searching for Static Links \n"); 

    crawl.runListURL(); 

} 

我希望让用户知道网站被抓取,这可能需要很长的时间。但是,在crawl.CrawlerInit和crawl.runCrawler完成之后,staticLinkTextArea.append才会生效。我如何强制它先发生?

+0

您应该在staticLinkTextArea上调用“invalidate()”来强制重绘。同时考虑将抓取工具放入“invokeLater”调用中。您肯定会在堆栈溢出中找到示例。 –

+0

@ AngelO'Sphere:不,'invalidate()'在这里不起作用,'repaint()'也不会。 invalidate方法只适用于Swing布局管理器,这里没有涉及,并且主要的底层问题是Swing事件线程正在被绑定。接下来你使用'invokeLater'的建议更糟糕,而且实际上很危险,因为那样你就可以保证长时间运行的代码在**上被称为**,这与你想要做的事情完全相反。 –

+0

_“我怎样才能强迫它首先发生?” - 在运行抓取工具之前追加到TextArea。 _“我该如何做到这一点?” - @HovercraftFullOfEels打败了我。 PS:该死的你气垫船! DAMN YOUUUUUUUUUUU! (JK = P) – XenoRo

回答

6

我想让用户知道该网站正在被抓取,这可能需要很长时间。但是,在crawl.CrawlerInit和crawl.runCrawler完成之后,staticLinkTextArea.append才会生效。我如何强制它先发生?

你是在Swing事件线程上运行长时间运行的代码并从而冻结该线程的经典示例。解决方案与往常一样:在后台线程(如new Thread(...)或SwingWorker)中运行长时间运行的代码。

例如,

private void runButtonActionPerformed(java.awt.event.ActionEvent evt) { 
    staticLinkTextArea.append("Building Site Map (this can take a while depending on depth) \n"); 
    crawl.CrawlerInit("http://www.asquithnurseries.co.uk/", "asquithnurseries.co.uk",1); 
    new Thread(new Runnable() { 
     public void run() { 
      crawl.runCrawler(); 
      crawl.runListURL(); 
     } 
    }).start(); 
    staticLinkTextArea.append("Building Complete Searching for Static Links \n"); 

} 

你使用你的方法名static不放心我,并希望他们的意思不是说你用静态方法在这里。

+0

这真是太棒了一件小事如何做我让它等待线程在运行前结束 staticLinkTextArea.append(“建立完整搜索静态链接\ n”); – PhoenixRising666

+0

@ PhoenixRising666:这就是使用SwingWorker会有所帮助的地方。 Google“Swing中的并发”并读取第一个命中。这是一个几页的教程,但非常值得。您可以通过其“done()”方法或通过您选择的PropertyChangeListener等待SwingWorker线程。 –