从不同 class 更新 java swing 组件
update java swing component from different class
我正在使用 crawler4j 开发一个爬虫项目,在它之上,我有一个 swing 界面。我有 2 种不同的情况,即 controller.java(也包含 SWING 组件)和 crawler.java。我正在尝试附加由 crawler.java 处理的输出并将其附加到控制器 class 中,该控制器还包含摆动组件。我尝试将控制器 class 的实例添加到爬虫 class 中,但 swing 组件未显示更新。
controller.java
//instantiate the crawler
CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
controller.addSeed("http://pastebin.com/");
controller.startNonBlocking(crawler.class, 1);
我在控制器中也有以下方法class来更新文本面板:
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 更改 - 例如删除元素等,请尝试重新验证和重新绘制您的布局,以便通知您的布局管理器数据 "dirty" 在您的摆动组件及其子组件。
查看 this question 了解更多。
我正在使用 crawler4j 开发一个爬虫项目,在它之上,我有一个 swing 界面。我有 2 种不同的情况,即 controller.java(也包含 SWING 组件)和 crawler.java。我正在尝试附加由 crawler.java 处理的输出并将其附加到控制器 class 中,该控制器还包含摆动组件。我尝试将控制器 class 的实例添加到爬虫 class 中,但 swing 组件未显示更新。
controller.java
//instantiate the crawler
CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
controller.addSeed("http://pastebin.com/");
controller.startNonBlocking(crawler.class, 1);
我在控制器中也有以下方法class来更新文本面板:
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 更改 - 例如删除元素等,请尝试重新验证和重新绘制您的布局,以便通知您的布局管理器数据 "dirty" 在您的摆动组件及其子组件。 查看 this question 了解更多。