JavaFX 2.1: kit de herramientas no inicializado

Javafx 2 1 Toolkit Not Initialized

adelante desde JavaFX 2.1: T oolkit no inicializado

Primero, el problema

Mi aplicación se basa en Swing. Quiero presentar JavaFX y configurarlo para renderizar escenas en una pantalla secundaria. Puedo usar JFrame para guardar un JFXPanel que puede contener JFXPanel, pero quiero hacer esto con la API de JavaFX.



Subclasificar com.sun.glass.ui.Application y usar Application.launch (esto) no es una opción porque el hilo de llamada será bloqueado.



Al crear una instancia de un escenario desde Swing EDT, el error que obtengo es:



|_+_|

problema : Las aplicaciones GUI de Swing no triviales necesitan ejecutar componentes JavaFX. El proceso de inicio de la aplicación inicializa la GUI después de iniciar la capa de servicio dependiente.

solución

Subclase Clase de aplicación JavaFX Y ejecútelo en un hilo separado, por ejemplo:



|_+_|

Nota al margen: debido a que el método Application.launch () acepta un parámetro java.lang.IllegalStateException: Toolkit not initialized, las variables globales deben usarse para representar el entorno JavaFX inicializado.

método alternativo: Crear una instancia de JFXPanel en el subproceso de despachador de eventos Swing

|_+_|

Al usar este método, el hilo de llamada esperará hasta que se configure el entorno JavaFX.

Elija la solución que crea adecuada. Elegí el segundo porque no requiere una variable global para representar la inicialización del entorno JavaFX y no desperdicia un hilo.

(1) Respuesta 1

La única forma de usar JavaFX es subclasificar la Aplicación o usar JFXPanel, precisamente porque han preparado env y kit de herramientas.

El bloqueo de subprocesos se puede resolver usando public class JavaFXInitializer extends Application { @Override public void start(Stage stage) throws Exception { // JavaFX should be initialized someGlobalVar.setInitialized(true) } }

Aunque si está usando JavaFX en la misma VM que Swing / AWT, recomiendo usar JFXPanel, puede encontrar más detalles aquí: ¿Está bien usar AWT con JavaFx?

(2) Respuesta 2

Encontré una solución. Si acabo de crear un JFXPanel desde Swing EDT antes de llamar a JavaFX Platform.runLater, estaría bien. No sé qué tan confiable es esta solución. Si el resultado es inestable, puedo elegir JFXPanel y JFrame.

|_+_|

(3) Responde tres

Utilicé el siguiente comando al crear pruebas unitarias para probar las actualizaciones de tableview de javaFX.

|_+_|

Aunque este artículo no tiene nada que ver con las pruebas, me ayuda a que mi prueba unitaria funcione

  • Sin BeforeClass initToolkit, instanciar un TableView en unittest resultará en un mensaje faltante del kit de herramientas.

(4) Respuesta 4

También puede inicializar explícitamente el kit de herramientas llamando a: Class

Un poco hacky, gracias a * impl, pero si no quieres usar final CountDownLatch latch = new CountDownLatch(1) SwingUtilities.invokeLater(new Runnable() { public void run() { new JFXPanel() // initializes JavaFX environment latch.countDown() } }) latch.await() o new Thread(...) es útil por alguna razón.

Desde Este artículo Republicate a ti mismo

(5) Responde cinco

Revisé el código fuente, esto es para inicializarlo.

|_+_|

Y dejarlo

|_+_|