JavaFX прекратить открывать URL в WebView - вместо этого откройте в браузере

Встроенный браузер WebView, который я использую, нуждается в специальной обработке для определенных URL-адресов, чтобы открывать их в собственном браузере по умолчанию вместо WebView. Фактическая часть просмотра работает нормально, но мне нужно, чтобы WebView также не отображал эту страницу. Я могу придумать несколько способов сделать это, но ни один из них не работает. Вот мой код:

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

Немного больше информации о том, что происходит в каждом из трех случаев

1. Загрузка предыдущего адреса
wv.getEngine().load(oldValue);

Это убивает JVM. Как ни странно, страница нормально открывается в родном браузере.

# 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. Отмена работника
wv.getEngine().getLoadWorker().cancel();

Ничего не делает, страница загружается как в WebView, так и в собственном браузере.

3. Использование history.back ()
wv.getEngine().executeScript("history.back()");

То же, что и выше, без эффекта.

4. Реакция на этап изменения вместо

Я также пытался вместо того, чтобы смотретьlocationProperty изWebEngineСлушай на ченжеstateProperty изWorker и запустить тот же код открытия, еслиnewState == State.SCHEDULED, Не было никакой разницы в результате от предыдущего метода (кроме невозможности использовать # 1).

Обновить

Код, который я использую сейчас, все еще приводит к сбою 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);
        }
    }
});
Временное решение

Хорошо, мне удалось заставить его работать, сорвав веб-просмотр и восстановив его.

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

Ответы на вопрос(8)

Ваш ответ на вопрос