Я пытаюсь интегрировать JavaFX WebView в свое приложение.
Проблема в том, что я хочу открывать ссылки в браузере по умолчанию, а не в WebView.
Я много гугл, и все говорят о классе Desktop, поэтому я попробовал.
Вот мой код:
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 (новый 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")
он работает нормально.
У вас есть идеи?
Благодарю.
Я не знаю, почему так происходит с java.awt.Desktop#browse(URI)
, но я обнаружил, что есть собственное решение JavaFX, использующее класс HostServices
. Поскольку вы используете 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");
}
}
Обратите внимание, что, насколько мне известно, вы можете получить HostServices
из вашего метода getHostServices()
Application
JavaFX.
newValue
и опубликовать несколько примеров значений, которые открываются файловым менеджером Windows?