我有一个加载新闻的课程。
package swing;
import java.awt.Color;
import java.net.URL;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import net.Logger;
import net.Util;
public class WebPanel extends JScrollPane implements Runnable {
private JTextPane editorPane;
private String link;
public WebPanel(final String link) {
this.link = link;
editorPane = new JTextPane();
editorPane.setContentType("text/html");
editorPane.setBackground(Color.DARK_GRAY);
editorPane.setEditable(false);
editorPane.setMargin(null);
editorPane.setBorder(null);
setBorder(null);
editorPane.setBackground(Color.DARK_GRAY);
editorPane.setText("<html><body><font color=\"#808080\"><br><center>Getting data</center></font></body></html>");
}
@Override
public void run() {
try {
editorPane.setPage(new URL(link));
} catch (Exception e) {
Logger.logError("setting web page failed ", e);
editorPane.setContentType("text/html");
editorPane.setText("<html><body><font color=\"#808080\"><br><center>Failed to get data<br>" + e.toString() + "</center></font></body></html>");
}
editorPane.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent he) {
if (he.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
try {
Util.openLink(he.getURL().toURI());
} catch (Exception e) {
Logger.logError("hyperlinkUpdate failed", e);
}
}
}
});
setViewportView(editorPane);
}
public String GetLink() {
return editorPane.getPage().toString();
}
public final void setLink(final String link) {
this.link = link;
}}
它是可以运行的,但是当我更新页面时(我有GUI类,我这样做)Lo
public static WebPanel scrollPane = new WebPanel(Util.newslink);
...
LoginForm.scrollPane.setLink(Util.newslink);
new Thread(LoginForm.scrollPane).start();
我的程序在加载页面之前不起作用(不能按任何按钮)。我尝试使用invokeLater()
创建线程,但没有任何帮助。
答案 0 :(得分:1)
最可能的原因是您正在等待GUI线程中的Web下载。这样做会在您等待时阻止GUI。
如果您不希望发生这种情况,请使用另一个线程进行下载,并使用invokeLater获取结果并在完成后更新GUI。
答案 1 :(得分:1)
现在,您正在对事件调度线程(EDT)进行阻塞调用,该线程负责更新GUI。这样会显示应用程序没有执行任何操作,因为在阻止调用之前它无法更新。你应该真正使用SwingWorker
在后台线程上做“重”工作。
请查看教程Concurrency in Swing,详细了解如何在后台线程上执行长时间运行的任务。