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);
}
}
}
'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
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. –