Hide aplicación JavaFX de usuario

master_obz:

Así que actualmente estoy trabajando en un proyecto en el que necesito para iniciar una ventana javafx rápida dentro de un método. Como no quiero hacer la clase de aplicación se extiende, mi solución era crear una clase interna que se extiende la aplicación y poner en marcha una ventana javafx dentro del método mediante la creación de una instancia de la clase interna y llamando lanzamiento en la clase interna como se muestra a continuación .

public void createWindow() {
    Fx window = new Fx();
    window.launchWindow();
}

public static class Fx extends Application {
    private void launchWindow() {
        launch();
    }

    public void start(Stage stage) {
        //javafx code
    }
}

El problema es que la clase interna tiene que ser público porque javafx requiere la clase que se puso en marcha para ser público, de lo contrario se producirá una excepción. Esto hace que el problema de los usuarios ahora ser capaz de acceder a la clase interna como de público.

¿Es posible hacer este privado o hacer alguna otra solución? O hay otra forma en que debería ir haciendo esto?

repollo:

El uso Application.launchno es la única manera de empezar el tiempo de ejecución de JavaFX, es sólo la opción estándar y el más utilizado. Otra opción es utilizar Platform.startup(Runnable)(JavaFX 9+). Ese método se iniciará el tiempo de ejecución de JavaFX e invocar la dada Runnableen el subproceso de la aplicación JavaFX .

Platform.startup(() -> {
    Stage stage = new Stage();
    stage.setScene(/* your built scene */);
    stage.show();
});

Hay algunas cosas importantes a tener en cuenta con este sistema:

  1. El tiempo de ejecución de JavaFX sólo se puede arrancar una vez por instancia de JVM; llamar startuppor segunda vez dará lugar a una IllegalStateException. Si el método se puede llamar más de una vez, entonces usted tendrá que utilizar Platform.runLater(Runnable)para la segunda y posteriores llamadas.

  2. Una vez que cierre el último Stagetiempo de ejecución de JavaFX, por defecto, se saldrá. Una vez que esto ocurre no se puede empezar de nuevo a menos que reinicie toda la JVM. Para evitar que esto suceda, el uso Platform.setImplicitExit(false). Ahora será responsable de detener el tiempo de ejecución de JavaFX utilizando Platform.exit().

  3. Usando startupbypasses el ciclo de vida JavaFX normal. En otras palabras, una instancia de una Applicationsubclase no se creará y el init(), start(Stage)y stop()no se invocará métodos.

  4. Si la parte de la aplicación JavaFX es trivial, nota que el tiempo de ejecución consumirá recursos después de que se ha iniciado durante el tiempo que existe la aplicación. Esto es cierto incluso después de cerrar la última ventana (y la salida implícita se ha ajustado a false). Una (posiblemente no trivial) solución a este problema es poner en marcha JavaFX en otro proceso que puede ser destruido, según sea necesario.


Si está utilizando Java 9+ luego otra opción (o al menos sin cargo) es el uso de módulos. Ponga su Applicationclase en un paquete que sólo se exporta al javafx.graphicsmódulo. Esto evitará que otros módulos puedan acceder a su Applicationclase, incluso si es público.

module app {
    requires javafx.graphics;
    exports com.example to javafx.graphics;
}

Nota: Esto no impide que la gente usando la ruta de clase o el uso --add-exports, pero que sería "el uso de la biblioteca de forma incorrecta", que significa el comportamiento no está especificado.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=223736&siteId=1
Recomendado
Clasificación