我正在尝试将JavaFX WebView集成到我的应用程序中。
问题是我想在默认浏览器中打开链接而不是在WebView中打开链接。
我google了很多,每个人都在谈论桌面类,所以我试了一下。
以下是我的相关代码:
webView.getEngine().locationProperty()
.addListener(new ChangeListener<String>() {
@Override
public void changed(
ObservableValue<? extends String> observable,
String oldValue, String newValue) {
Platform.runLater(() -> webView.getEngine().loadContent(content.get()));
new Thread() {
@Override
public void run() {
BrowserOpener.open(newValue);
}
}.start();
}
});
然而,它似乎有效,但有一个问题。 webView.getEngine()。locationProperty() .addListener(new ChangeListener(){
@Override
public void changed(
ObservableValue<? extends String> observable,
String oldValue, String newValue) {
Platform.runLater(() -> webView.getEngine()
.loadContent(content.get()));
new Thread() {
@Override
public void run() {
BrowserOpener.open(newValue);
}
}.start();
}
});
BrowserOpener:
public static void open(String uriString) {
openUri(URI.create(uriString));
}
public static void openUri(URI uri) {
if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) {
try {
desktop.browse(uri);
} catch (Exception e) {
e.printStackTrace();
}
}
}
然而,它似乎有效,但有一个问题。如果我运行此应用程序并单击链接,默认浏览器将打开链接,但问题出在此处。 Windows文件管理器也在打开。
如果我将BrowserOpener.open(newValue)
更改为BrowserOpener.open("http://google.com")
它的工作正常。
你们有什么想法吗?
感谢。
答案 0 :(得分:2)
我不知道为什么它与java.awt.Desktop#browse(URI)
的行为方式相同,但我发现有一个使用HostServices
类的原生JavaFX解决方案。既然您正在使用JavaFX,那么无论如何它可能是一个更好的主意。这是我刚试过的一个例子:
import javafx.application.Application;
import javafx.application.HostServices;
import javafx.stage.Stage;
public class BrowseTest extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage arg0) throws Exception {
HostServices host = getHostServices();
host.showDocument("http://google.com");
}
}
请注意,据我所知,您只能从JavaFX HostServices
Application
方法获取getHostServices()
。