我开发了一个非常简化但功能齐全的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加载网页。我希望当我点击任何搜索结果时,点击的超链接应该在现有“主页”标签旁边的新标签页中打开。
在广泛搜索互联网后,我无处可去。
请帮我提供相关代码。感谢。
答案 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
。
以下是基于您的代码的完整,有效的示例:
Tab