2017-06-14 6 views
1

私はJavaベースのWebクローラーを開発しています。私はJFrameを作成しました(Java:Swing)。クローラが正常に動作しています。それは設立されたリンクを訪問している。しかし、私はJTextAreaで動的にクロールされたリンクを追加したいのですが、そうではありません。私はそんなことはできません。私はこれを試すと私のプログラムはフリーズンです。しかし、私はコンソールにアクセスしたURLを設定することができます。このようなJava Swingを使用したWebクローリング

image

私のコードの行::私は動的に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(); 

理由は次のとおりです。

+0

UIイベントスレッドからこのコードを呼び出していますか?ほとんどのSwingコントロールはUIイベントスレッドからのみ呼び出されます。 –

+0

Stack Overflowへようこそ[ツアー]に行き、[ヘルプ]をクリックして[質問]に進みます。これは後で問題を示す有効な[mcve]を投稿するように指示します。つまり、あなたのプログラムは不完全であり、コンパイルできないので、私たちはあなたのアプリ全体を望んでいませんが、あなたの問題を示すシンプルで完全な例(コードスニペットではありません)です。たとえば、URLをハードコードし、プロセスを開始する 'JTextArea'と' JButton'を1つ持つことができます。私たちはあなたのGUIがフリーズしていることを知っていますが、十分な情報が不足しているためにあなたの質問が広すぎます(MCVE)... – Frakcool

+0

...あなたが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

答えて

0

はこれを試してみてください。新しいスレッドを作成してそこから実行することで、別のスレッドで操作を開始します。 更新を取得するにはEventQue これはGUIスレッドにJTextAreaにテキストを追加するように指示します

関連する問題