2017-01-31 3 views
1

Ich habe einen sehr vereinfachten, aber voll funktionsfähigen JavaFX Webbrowser entwickelt, um zu veranschaulichen, was ich fragen möchte. Hier folgt der Quellcode.Das Öffnen der Webseite in einem anderen Tab vom Hyperlink der aktuellen Webseite in der Webansicht des Javafx Browsers

public class OpenInNewTab extends Application {  
@Override 
public void start(Stage primaryStage) 
{ 
    TabPane tabPane = new TabPane();  

    WebView webView = new WebView(); 

    Tab tab = new Tab("Home Tab"); 
    tab.setContent(webView); 

    tabPane.getTabs().add(tab); 

    webView.getEngine().load("https://www.google.co.in/?gws_rd=ssl#q=javafx"); 

    BorderPane root = new BorderPane(); 
    root.setTop(tabPane); 

    Scene scene = new Scene(root, 600, 339); 

    primaryStage.setTitle("Basic browser"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
}  
public static void main(String[] args) 
{ 
    launch(args); 
} } 

Dieser Browser lädt eine Webseite von dieser link. Ich möchte, dass, wenn ich auf eines der Suchergebnisse klicke, der angeklickte Hyperlink in einem neuen Tab neben dem vorhandenen "Home-Tab" geöffnet werden soll.

Nach umfangreicher Suche im Internet erreichte ich nichts.

Bitte helfen Sie mir mit entsprechenden Code. Vielen Dank.

+0

'im Internet ausführlich Nach der Suche, ich nowhere' die genau die gleiche Lösung erreicht, die Sie gerade für Ihre Frage angenommen hat Ein Link, den ich gestern in einem Kommentar zu deiner anderen (sehr ähnlichen) Frage gepostet habe! Hast du meinen Kommentar nicht gelesen, bevor du eine neue Frage gestellt hast? [hier] (http://blogs.kiyut.com/tonny/2013/07/30/javafx-webview-addhyperlinklistener/) – MikaelF

+0

Danke an dich, aber ich hatte deinen Link schon ausprobiert. Aber die Antwort, die ich akzeptierte, war direkt in der Form, die für mich illustrativ war. Obwohl ich Rechtsklick anstelle von Linksklick gewünscht hatte, musste ich mich damit zufrieden geben, was ich bekam. –

Antwort

0

Zuerst müssen Sie eine Möglichkeit finden, alle ausgehenden Klickereignisse auf der angezeigten Seite zu behandeln. Ich habe eine Hilfsmethode entwickelt, um das zu erreichen. Es erstellt einen Ereignis-Listener für jeden Link, auf den Sie klicken, um einen neuen Tab zu öffnen.

private void handleUrls(Document doc) { 
    NodeList links = doc.getElementsByTagName("a"); 
    for (int i = 0; i < links.getLength(); i++) { 
     EventTarget eventTarget = (EventTarget) links.item(i); 
     String link = links.item(i).toString(); 
     eventTarget.addEventListener("click", e -> { 
      WebView webView = new WebView(); 
      alterWebView(webView); 

      Tab tab = new Tab(link); 
      tab.setContent(webView); 
      tab.setClosable(true); 

      webView.getEngine().load(link); 

      tabPane.getTabs().add(tab); 

      e.preventDefault(); 
     }, false); 
    } 
} 

Sie können einen besseren Namen für die Registerkarte setzen ... Ich habe einen Link als Notlösung verwendet, aber es ist lang und chaotisch.

webView.getEngine().load(link); 

Die alterWebView oben verwiesen wird, ist eine andere Hilfsfunktion. Es ist verantwortlich für die Verfolgung des Ladevorgangs. Sobald die Worker nichts tut, fügt sie Listener zu allen URLs hinzu.

private void alterWebView(WebView webView) { 
    WebEngine engine = webView.getEngine(); 
    Worker worker = engine.getLoadWorker(); 

    worker.stateProperty().addListener((oldVal, newVal, o) -> { 
     if (newVal.equals(State.RUNNING)) { 
      handleUrls(engine.getDocument()); 
     } 
    }); 
} 

Also im Grunde die Logik hinter dem Code oben wie folgt:

  • Wir haben unsere WebEngine verfolgen ‚s State, bis die Seite vollständig geladen ist und wir dann Ereignis-Listener zu jeder URL hinzuzufügen.

  • Diese Zuhörer, wenn sie aufgerufen wird, wird eine neue WebView, behandeln sie entsprechend erstellen und an die TabPane in einem neuen Tab hinzuzufügen.

Und hier ist die komplette, funktionierendes Beispiel auf dem Code basiert:

public class JavaFXTest extends Application { 

    private TabPane tabPane; 

    @Override 
    public void start(Stage primaryStage) { 
     tabPane = new TabPane(); 
     WebView webView = new WebView(); 
     alterWebView(webView); 

     Tab tab = new Tab("Home Tab"); 
     tab.setContent(webView); 
     tab.setClosable(true); 

     tabPane.getTabs().add(tab); 

     webView.getEngine().load("https://www.google.co.in/?gws_rd=ssl#q=javafx"); 

     BorderPane root = new BorderPane(); 
     root.setTop(tabPane); 

     Scene scene = new Scene(root, 600, 339); 

     primaryStage.setTitle("Basic browser"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

    private void alterWebView(WebView webView) { 
     WebEngine engine = webView.getEngine(); 
     Worker worker = engine.getLoadWorker(); 

     worker.stateProperty().addListener((oldVal, newVal, o) -> { 
      if (newVal.equals(State.RUNNING)) { 
       handleUrls(engine.getDocument()); 
      } 
     }); 
    } 

    private void handleUrls(Document doc) { 
     NodeList links = doc.getElementsByTagName("a"); 
     for (int i = 0; i < links.getLength(); i++) { 
      EventTarget eventTarget = (EventTarget) links.item(i); 
      String link = links.item(i).toString(); 
      eventTarget.addEventListener("click", e -> { 
       WebView webView = new WebView(); 
       alterWebView(webView); 

       Tab tab = new Tab(link); 
       tab.setContent(webView); 
       tab.setClosable(true); 

       webView.getEngine().load(link); 

       tabPane.getTabs().add(tab); 

       e.preventDefault(); 
      }, false); 
     } 
    } 
} 
+0

Vielen Dank !! Ich habe deinen Code kompiliert und ausgeführt. Es hat ausgezeichnet funktioniert! Noch einmal danke ich Ihnen für Ihre schnelle und genaue Antwort. –

+0

Gut zu hören :) Sie können meine Antwort als akzeptiert markieren, so dass andere Benutzer sehen, dass Sie eine Lösung gefunden haben. – Dth

+0

Ich werde mich sehr freuen. Da ich ein sehr neuer Benutzer bin, muss ich herausfinden, wie Sie Ihre Antwort als akzeptiert markieren, aber ich werde das auf jeden Fall tun. Die Art und Weise, wie Sie die Logik erklärten, war auch sehr spürbar. Noch einmal vielen Dank! –

Verwandte Themen