es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La aplicación de JavaFX no se compila correctamente cuando se utiliza LauncherImpl en lugar de Application.

Tengo una aplicación JavaFX que se compila a nativo utilizando el complemento GluonFx.
Quiero añadir un Preloader para mostrar al iniciar. Lo logré cambiando la inicialización de:

Application.launch(MainView.class, args) a LauncherImpl.launchApplication(MainView.class, MyPreloader.class, args)

El proceso de compilación se ejecuta hasta el final sin errores, pero la aplicación no arranca.
Si intento ejecutar el agente (mvn gluonfx:runagent), obtengo el siguiente error:
cannot access class com.sun.javafx.application.LauncherImpl (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.application to unnamed module

¿Alguien sabe cómo solucionar esto, o qué otra forma puedo usar para cargar mi Preloader?

PD: Funciona correctamente desde el IDE. El problema ocurre después de la compilación a nativo.

Gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Según el mensaje de error, parece que el módulo javafx.graphics no exporta el paquete requerido al módulo sin nombre. Para resolver este problema, puedes intentar agregar la siguiente opción de línea de comandos al proceso de compilación:

    --add-exports=javafx.graphics/com.sun.javafx.application=ALL-UNNAMED

    Esto permitirá que el módulo sin nombre acceda a la clase LauncherImpl del módulo javafx.graphics.

    Otra forma de cargar tu precargador es mediante el uso de la clase Preloader proporcionada por JavaFX. Puedes crear un precargador personalizado mediante la extensión de la clase Preloader y la anulación de sus métodos. Luego, puedes establecer la clase del precargador utilizando Application.Parameters antes de lanzar la aplicación. Aquí tienes un ejemplo:

    public class MyPreloader extends Preloader {
    
        @Override
        public void start(Stage primaryStage) throws Exception {
            // muestra aquí tu etapa de precarga
        }
    
        @Override
        public void handleApplicationNotification(PreloaderNotification info) {
            // maneja eventos de notificación de la aplicación
        }
    
        @Override
        public void handleStateChangeNotification(StateChangeNotification info) {
            // maneja eventos de cambio de estado
        }
    
        // otros métodos de precarga para anular
    
    }
    

    Y luego en tu clase principal:

    public class MainView extends Application {
    
        @Override
        public void start(Stage primaryStage) throws Exception {
            // lógica de tu aplicación aquí
        }
    
        public static void main(String[] args) {
            // establece la clase del precargador antes del lanzamiento
            Application.Parameters params = getParameters();
            params.setPreloader(MyPreloader.class.getName());
    
            // lanza la aplicación normalmente
            launch(MainView.class, args);
        }
    
    }
    

    Utilizando este enfoque, puedes evitar los problemas relacionados con el complemento GluonFx y asegurarte de que tu precargador funcione correctamente en la aplicación nativa.

Comments are closed.