1
私はJavaベースのWebクローラーを開発しています。私はJFrameを作成しました(Java:Swing)。クローラが正常に動作しています。それは設立されたリンクを訪問している。しかし、私はJTextAreaで動的にクロールされたリンクを追加したいのですが、そうではありません。私はそんなことはできません。私はこれを試すと私のプログラムはフリーズンです。しかし、私はコンソールにアクセスしたURLを設定することができます。このようなJava Swingを使用したWebクローリング
私のコードの行::私は動的にJTextAreaの中で訪れたURLを設定するにはどうすればよい
Document html = null;
try {
html = Jsoup.connect(url).get();
Elements links = html.select("a");
for(Element link: links) {
String tmp = link.attr("abs:href");
jTextArea2.append(tmp + "\n");
if(!this.visitedUrl.contains(tmp)) {
this.foundedUrl.add(tmp);
System.out.println(tmp);
}
}
while(this.foundedUrl.size() > 0) {
String tmp = this.foundedUrl.get(this.foundedUrl.size() - 1);
this.foundedUrl.remove(this.foundedUrl.size() - 1);
if(!this.visitedUrl.contains(tmp)) {
this.linkTracker(tmp);
}
}
このような
私のGUI?あなたはGUIのスレッドをブロックしているので、あなたはGUIが凍結され
new Thread((Runnable)() ->
{
Document html = null;
try {
html = Jsoup.connect(url).get();
Elements links = html.select("a");
for(Element link: links) {
String tmp = link.attr("abs:href");
EventQueue.invokeLater(() -> {
jTextArea2.append(tmp + "\n");
});
if(!this.visitedUrl.contains(tmp)) {
this.foundedUrl.add(tmp);
System.out.println(tmp);
}
}
while(this.foundedUrl.size() > 0) {
String tmp = this.foundedUrl.get(this.foundedUrl.size() - 1);
this.foundedUrl.remove(this.foundedUrl.size() - 1);
if(!this.visitedUrl.contains(tmp)) {
this.linkTracker(tmp);
}
}
}catch(Exception e){}
}).start();
理由は次のとおりです。
UIイベントスレッドからこのコードを呼び出していますか?ほとんどのSwingコントロールはUIイベントスレッドからのみ呼び出されます。 –
Stack Overflowへようこそ[ツアー]に行き、[ヘルプ]をクリックして[質問]に進みます。これは後で問題を示す有効な[mcve]を投稿するように指示します。つまり、あなたのプログラムは不完全であり、コンパイルできないので、私たちはあなたのアプリ全体を望んでいませんが、あなたの問題を示すシンプルで完全な例(コードスニペットではありません)です。たとえば、URLをハードコードし、プロセスを開始する 'JTextArea'と' JButton'を1つ持つことができます。私たちはあなたのGUIがフリーズしていることを知っていますが、十分な情報が不足しているためにあなたの質問が広すぎます(MCVE)... – Frakcool
...あなたがEDTであなたのアプリを初期化できなかったか、 EDTでは、[Swing Worker](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html)も参照してください。これにより、長いタスクをEDTをブロックしないでください(GUIがフリーズします)。また、[同時実行のスイング](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)も参照してください。 – Frakcool