Java Runnable不';行不通

Java Runnable不';行不通,java,swing,Java,Swing,我上了一堂新闻课 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;

我上了一堂新闻课

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;
   }}

我的程序在加载页面之前无法工作(无法按下任何按钮)。我尝试使用
invokeLater()
创建线程,但没有任何帮助。

最可能的原因是您正在GUI线程中等待web下载。这样做会在您等待时阻塞GUI


如果您不希望发生这种情况,请使用另一个线程进行下载,并使用invokeLater获取结果并在完成后更新GUI。

现在您正在对负责更新GUI的事件调度线程(EDT)进行阻塞调用。这将显示应用程序没有执行任何操作,因为它在您的阻止呼叫之前无法更新。你真的应该利用一个线程来完成后台线程的“繁重”工作


有关如何在后台线程上执行长时间运行任务的详细信息,请参阅本教程。

您正在从一个线程与GUI对象交互,而这个线程不是-这通常是个坏主意…您是否可以删除不必要的代码位来重现不需要的行为?这是对swing线程swing的规则,您启动的第二个线程与错误的UI组件交互。您应该使用SwingWorker来实现这一点
public static WebPanel scrollPane = new WebPanel(Util.newslink);
...
LoginForm.scrollPane.setLink(Util.newslink);
new Thread(LoginForm.scrollPane).start();