2016-03-05 2 views
3

В настоящее время я играю с лицензией Evaluation для JxBrowser 6.2.JxBrowser HEAVYWEIGHT Dispose on WINDOW_CLOSE_REQUEST

Я создаю BrowserView следующим образом:

Browser browser = new Browser(BrowserType.HEAVYWEIGHT); 
BrowserView browser_view = new BrowserView(browser); 

Я прилагаю компонент BrowserView следующим образом:

stage.setScene(new Scene(browser_view)); 

Если браузер настроен на работу в сокращенном режиме, я м, которые могут быть выполнены:

browser_view.getBrowser().dispose(); 
Platform.exit(); 

Однако, если браузер настроен на работу в HEAVYWEIGH Режим T, то приложение зависает при выполнении:

browser_view.getBrowser().dispose(); 

Я могу видеть в журналах, что было написано сообщение Dispose, но это, кажется, как будто процессы JxBrowser хрома никогда не получить/процесс сообщения.

Любые идеи?

ответ

2

Как ответил мне, прежде чем решение это расположить браузер после того, как этап был скрыт (закрыт).
Хорошим подходом было бы поместить эти команды в метод приложения JavaFX stop().
Так что в любом случае вы закроете окно (нажав кнопку закрытия или программно, вызывая Platform.exit()), браузер будет утилизировать (и все приложение будет завершено и завершено).

Нечто подобное:

@Override 
public void stop() throws Exception { 
    stage.hide(); 
    browser.dispose(); 
} 
0

Похоже, вам необходимо убедиться, что этап был закрыт до вызова.

stage.close(); 
browser_view.getBrowser().dispose(); 
Platform.exit(); 
+0

Если вы используете 'stage.setOnHidden()' вместо 'stage.setOnCloseRequest()', вам гарантируется, что этап уже закрыт. –

+0

Хм ... Я просто выстрелил. Хотя в документации Java сказано, что close() эквивалентно hide(), и что hide() просто устанавливает видимость окна в false, close(), похоже, делает больше. Браузер все еще висит до тех пор, пока сцена не будет явно закрыта. – blf

+0

Но обработчик 'setOnHidden', в отличие от обработчика' setOnCloseRequest', который вы сказали, что используете, не вызывается до тех пор, пока этап не будет закрыт. –

0

Пожалуйста, попробуйте называть этот код асинхронно. Может быть, это просто тупиковый:

Platform.runLater(new Runnable() { 
    @Override 
    public void run() { 
     browser_view.getBrowser().dispose(); 
     Platform.exit(); 
    } 
}); 
1

В качестве эталона, я использовал конфигурацию, описанную здесь link (Раздел: 9. Всплывающие окна).

Platform.runLater(() -> { 
    browser.dispose(); 
}); 

Platform.runLater(() -> { 
    stage.close(); 
}); 
Смежные вопросы