从不同的类更新javaswing组件



我正在使用crawler4j进行一个爬网程序项目,除此之外,我还有一个swing接口。我有两种不同的情况,即controller.java(也包含SWING组件)和crawler.java。我试图将crawler.java处理的输出附加到controller类中,该类也包含SWING组件。我尝试将控制器类的一个实例添加到crawler类中,但swing组件没有显示更新。

控制器.java

//instantiate the crawler
CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
controller.addSeed("http://pastebin.com/");
controller.startNonBlocking(crawler.class, 1);

我在控制器类中也有以下方法来更新文本窗格:

public void setTextOP(String t){
    outputPane.setText(t);
}

在crawler.java 中

public class crawler extends WebCrawler {
controller c;
public crawler(controller c) {
    this.c = c;
}
@Override
public void visit(Page page) {
    int docid = page.getWebURL().getDocid();
    String url = page.getWebURL().getURL();
    String domain = page.getWebURL().getDomain();
    String subDomain = page.getWebURL().getSubDomain();
    int parentDocid = page.getWebURL().getParentDocid();
    System.out.println("Docid: " + docid);
    System.out.println("URL: " + url);
    System.out.println("Domain: '" + domain + "'");
    System.out.println("Sub-domain: '" + subDomain + "'");
    if (page.getParseData() instanceof HtmlParseData) {
        HtmlParseData htmlParseData = (HtmlParseData)page.getParseData();
        String text = htmlParseData.getText();
        String html = htmlParseData.getHtml();
        List<WebURL> links = htmlParseData.getOutgoingUrls();
        c.setTextOP(text);
      }
  }

我真的很感激你给我一些建议。非常感谢。

PS:文本输出在IDE控制台中打印良好。

您似乎正在尝试从另一个非GUI线程更新UI线程。为此,请使用SwingUtilities.invokeLater方法,该方法使用Runnable来更新UI线程:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        YourClassInstance.setTextOP("text");
      }
    }
});

我没有你的布局的确切图像,但这应该可以做到。

如果您也在进行其他GUI更改,例如删除元素等,请尝试重新验证和重新绘制布局,以便通知布局管理器swing组件及其子组件中的数据"脏"。查看此问题了解更多信息。

相关内容

  • 没有找到相关文章

最新更新