从javafx浏览器的webview中的当前网页的超链接在另一个选项卡中打开网页

时间:2017-01-31 05:41:29

标签: javafx

我开发了一个非常简化但功能齐全的JavaFX Web浏览器,用于说明我想要问的内容。以下是源代码。

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

此浏览器从此link加载网页。我希望当我点击任何搜索结果时,点击的超链接应该在现有“主页”标签旁边的新标签页中打开。

在广泛搜索互联网后,我无处可去。

请帮我提供相关代码。感谢。

1 个答案:

答案 0 :(得分:0)

首先,您需要找到一种方法来处理显示页面上的所有外发点击事件。我已经制定了一个辅助方法来实现这一目标。它为每个链接创建一个事件监听器,单击该链接将打开一个新选项卡。

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

你可能想为你的标签设置一个更好的名字......我已经使用链接作为临时解决方案,但它很长而且很乱。

webView.getEngine().load(link);

上面引用的alterWebView是另一个辅助函数。它负责跟踪加载进度。一旦Worker什么都不做,它就会向所有网址添加监听器。

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

基本上,上面代码背后的逻辑如下:

  • 我们跟踪WebEngine的{​​{1}},直到网页完全加载,然后我们为每个网址添加事件监听器。

  • 这些侦听器在调用时会创建一个新的State,相应地处理它,并将其添加到新WebView内的TabPane

    < / LI>

以下是基于您的代码的完整,有效的示例:

Tab