JavaFX przestaje otwierać URL w WebView - zamiast tego otwórz przeglądarkę
Wbudowana przeglądarka WebView, której używam, wymaga specjalnej obsługi określonych adresów URL, aby otworzyć je w rodzimej domyślnej przeglądarce zamiast WebView. Rzeczywista część przeglądania działa poprawnie, ale muszę również zatrzymać wyświetlanie tej strony przez WebView. Mogę wymyślić kilka sposobów, aby to zrobić, ale żaden z nich nie działa. Oto mój kod:
this.wv.getEngine().locationProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue)
{
Desktop d = Desktop.getDesktop();
try
{
URI address = new URI(observable.getValue());
if ((address.getQuery() + "").indexOf("_openmodal=true") > -1)
{
// wv.getEngine().load(oldValue); // 1
// wv.getEngine().getLoadWorker().cancel(); // 2
// wv.getEngine().executeScript("history.back()"); // 3
d.browse(address);
}
}
catch (IOException | URISyntaxException e)
{
displayError(e);
}
}
});
Nieco więcej informacji o tym, co dzieje się w każdym z trzech przypadków
1. Ładowanie poprzedniego adresuwv.getEngine().load(oldValue);
To zabija JVM. Co ciekawe, strona otwiera się dobrze w rodzimej przeglądarce.
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000005b8fef38, pid=7440, tid=8000
#
# JRE version: 7.0_09-b05
# Java VM: Java HotSpot(TM) 64-Bit Server VM (23.5-b02 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C [jfxwebkit.dll+0x2fef38] Java_com_sun_webpane_platform_BackForwardList_bflItemGetIcon+0x184f58
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\Users\Greg Balaga\eclipse\Companyapp\hs_err_pid7440.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
2. Anulowanie pracownikawv.getEngine().getLoadWorker().cancel();
Nic nie robi, strona ładuje się zarówno do WebView, jak i do rodzimej przeglądarki.
3. Korzystanie z history.back ()wv.getEngine().executeScript("history.back()");
Tak jak powyżej, bez efektu.
4. Zamiast tego reagować na zmiany na stole montażowymPróbowałem też zamiast patrzećlocationProperty
zWebEngine
, posłuchaj na chenges zastateProperty
zWorker
i uruchom ten sam kod otwarcia, jeślinewState == State.SCHEDULED
. Nie było różnicy w wynikach poprzedniej metody (poza faktem, że nie był w stanie użyć # 1).
Kod, którego używam, nadal powoduje awarię maszyny JVM:
this.wv.getEngine().locationProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, final String oldValue, String newValue)
{
Desktop d = Desktop.getDesktop();
try
{
URI address = new URI(newValue);
if ((address.getQuery() + "").indexOf("_openmodal=true") > -1)
{
Platform.runLater(new Runnable() {
@Override
public void run()
{
wv.getEngine().load(oldValue);
}
});
d.browse(address);
}
}
catch (IOException | URISyntaxException e)
{
displayError(e);
}
}
});
Obejście problemuOk, udało mi się sprawić, żeby działało, zrywając przeglądarkę internetową i odbudowując ją.
this.wv.getEngine().locationProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, final String oldValue, String newValue)
{
Desktop d = Desktop.getDesktop();
try
{
URI address = new URI(newValue);
if ((address.getQuery() + "").indexOf("_openmodal=true") > -1)
{
Platform.runLater(new Runnable() {
@Override
public void run()
{
grid_layout.getChildren().remove(wv);
wv = new WebView();
grid_layout.add(wv, 0, 1);
wv.getEngine().load(oldValue);
}
});
d.browse(address);
}
}
catch (IOException | URISyntaxException e)
{
displayError(e);
}
}
});