2017-06-14 4 views
1

Ich entwickle eine Web-Crawler Java basiert. Ich habe einen JFrame (Java: Swing) erstellt. Mein Crawler wird erfolgreich ausgeführt. Es besucht einen Link. Aber ich möchte dynamisch gecrawlte Verbindung in JTextArea hinzufügen, tut es aber nicht. Ich kann das nicht tun. Wenn ich das versuche, ist mein Programm freezen. Aber ich kann besuchte URL zur Konsole einstellen.Web Crawling Mit Java Swing

Meine gui wie folgt aus:

image

Meine Codezeilen wie folgt aus:

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

Wie kann ich dynamisch url in JTextArea besucht eingestellt?

+0

Rufen Sie diesen Code aus der UI-Ereignis-Thread? Die meisten Swing-Steuerelemente werden nur vom UI-Ereignisthread aufgerufen. –

+0

Willkommen bei Stack Overflow, bitte nimm die [Tour] und gehe durch die [Hilfe], die dich zu [ask] führt. Dies wird dir später sagen, dass du ein gültiges [mcve] postest, das dein Problem demonstriert. Da Ihr Programm unvollständig ist und daher nicht kompilierbar ist, möchten wir nicht Ihre gesamte App, sondern ein einfaches, aber vollständiges Beispiel (nicht Code-Snippets), das Ihr Problem veranschaulicht. Zum Beispiel können Sie die URLs fest codieren und haben eine einzelne 'JTextArea' und eine' JButton', die den Prozess starten. Wir kennen Ihre GUI friert, aber Ihre Frage ist zu weit gefasst, da es genügend Informationen fehlt (dh die MCVE) verantwortlich zu sein ... – Frakcool

+0

... weil Sie nicht Ihre App im EDT initialisiert haben könnte oder Sie laufen diese in der EDT, wahrscheinlich möchten Sie sich auch [Swing Worker] (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html) ansehen, damit Sie lange Aufgaben in einem Trennen Sie den Thread und blockieren Sie nicht den EDT (der Ihre GUI einfriert). Bitte lesen Sie auch über [Parallelität in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) – Frakcool

Antwort

0

versuchen Sie dies:

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(); 

Der Grund, warum Sie GUI friert, da Sie den GUI-Thread blockieren. Starten Sie Ihre Operationen in einem anderen Thread, indem Sie einen neuen Thread erstellen und von dort starten. Um dann Updates zu erhalten, rufen Sie EventQue Es wird der GUI-Thread den Text zu der JTextArea hinzufügen