-2

ニュースを載せるクラスがありました。

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()たが、何も役に立ちませんでした。

4

2 に答える 2

1

最も可能性の高い原因は、GUI スレッドで Web ダウンロードを待機していることです。これを行うと、待機中に GUI がブロックされます。

これが発生したくない場合は、ダウンロードに別のスレッドを使用し、invokeLater を使用して結果を取得し、終了時に GUI を更新します。

于 2013-03-09T20:32:45.227 に答える
1

現在、GUI の更新を担当するイベント ディスパッチ スレッド (EDT) でブロッキング呼び出しを行っています。これにより、ブロック呼び出しまで更新できないため、アプリは何もしていないように見えます。SwingWorkerバックグラウンドスレッドで「重い」作業を行うには、 a を実際に使用する必要があります。

バックグラウンド スレッドで長時間実行されるタスクを実行する方法の詳細については、Swing での同時実行のチュートリアルを参照してください。

于 2013-03-09T20:33:49.997 に答える