javafx в исключении Swing Toolkit не инициализирован

Я прочитал сообщение: JavaFx 2. x — Swing: не в потоке приложения FX

со ссылкой на «Исключение в потоке» AWT-EventQueue-0» java.lang.IllegalStateException: Toolkit не инициализирован»

Я нашел здесь обсуждение JavaFX 2.1: Toolkit не инициализирован

но я не могу использовать решение

«Инициировать JFXPanel в потоке диспетчера событий Swing:»

потому что это остается неопределенным временем ожидания.

У меня такая же проблема с использованием JInternalFrame внутри JDesktopPane.

Я пробовал:

final CountDownLatch latch = new CountDownLatch(1);
SwingUtilities.invokeLater(new Runnable() {
  @Override
  public void run() {
    final JFXPanel javafxPanel = new JFXPanel();
    latch.countDown();       
    BorderPane pane = new BorderPane();
    javafxPanel.setScene( new Scene(pane) {
      Text text = new Text("Hello World");            
    });
    frame.getContentPane().add(javafxPanel, BorderLayout.CENTER);
  }
});        
this.add(frame);
try {
    latch.await();
} catch (InterruptedException ex) {
    System.out.println("err");
    Logger.getLogger(WorkspacePanel.class.getName()).log(Level.SEVERE, null,     ex);
}

Где фрейм — это JInternalFrame, а это — JDesktopPane.

Любая помощь ? Заранее спасибо.


person famedoro    schedule 31.08.2012    source источник


Ответы (1)


потому что это остается неопределенным временем ожидания.

Это ожидание может быть вызвано latch. Если опубликованный вами код запускается в потоке отправки событий, вызов latch.await() заблокирует EDT и гарантирует, что Runnable, который вы разместили в EDT, никогда не будет выполнен, поэтому оператор latch.countDown() никогда не будет достигнут. Вы можете быстро проверить это с помощью метода EventQueue.isDispatchThread.

Я бы настоятельно рекомендовал просто удалить CountDownLatch, так как запуск этого кода на другом Thread невозможен, поскольку вы работаете с компонентами Swing, доступ к которым/изменение/создание/... следует выполнять в потоке отправки событий.

Кроме того, после удаления защелки вы столкнетесь с тем же исключением, что и в связанном вопросе. То

javafxPanel.setScene( new Scene(pane) {
  Text text = new Text("Hello World");            
});

должен выполняться в потоке JavaFX, а не в потоке отправки событий. См. мой ответ на этот вопрос о том, как это решить.

person Robin    schedule 31.08.2012