La ubicación de JavaFX no está configurada como mensaje de error
nullpointerexception stage (17)
Convertí una aplicación simple de NetBeans 8 Java FXML a la de Maven. Luego tuve problemas porque los métodos getResource()
no podían encontrar los archivos .fxml. En la aplicación original de la mina, los archivos fxmls estaban dispersos en el árbol de paquetes, cada uno al lado de su archivo de clase de controlador. Después de hacer Clean y construir en NetBeans, verifiqué el resultado .jar en la carpeta de destino. El .jar no contenía ningún fxml. Todos los fxmls fueron extrañamente desaparecidos.
Luego pongo todos los fxmls en la carpeta resources / fxml y establezco los parámetros del método getResource en consecuencia, por ejemplo: FXMLLoader(App.class.getClassLoader().getResource("fxml/ObjOverview.fxml"));
En este caso, todo salió bien. La carpeta fxml apareció en la raíz de .jar y contenía todos mis fxmls. El programa estaba funcionando como se esperaba.
Tengo un problema al intentar cerrar la escena actual y abrir otra escena cuando está seleccionado menúArtículo. Mi escenario principal está codificado de la siguiente manera:
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("Shop Management");
FXMLLoader myLoader = new FXMLLoader(getClass().getResource("cartHomePage.fxml"));
Pane myPane = (Pane) myLoader.load();
CartHomePageUI controller = (CartHomePageUI) myLoader.getController();
controller.setPrevStage(primaryStage);
Scene myScene = new Scene(myPane);
primaryStage.setScene(myScene);
primaryStage.show();
}
Cuando se ejecuta el programa, irá a cartHomePage.fxml. Desde allí, puedo seleccionar ir a crear producto o crear categoría cuando se selecciona el elemento del menú. Aquí está mi evento de acción:
Stage prevStage;
public void setPrevStage(Stage stage){
this.prevStage = stage;
}
public void gotoCreateCategory(ActionEvent event) throws IOException {
Stage stage = new Stage();
stage.setTitle("Shop Management");
FXMLLoader myLoader = new FXMLLoader(getClass().getResource("createCategory.fxml"));
Pane myPane = (Pane) myLoader.load();
Scene scene = new Scene(myPane);
stage.setScene(scene);
prevStage.close();
setPrevStage(stage);
stage.show();
}
//Method to change scene when menu item create product is on click
@FXML
public void gotoCreateProduct(ActionEvent event) throws IOException {
Stage stage = new Stage();
stage.setTitle("Shop Management");
FXMLLoader myLoader = new FXMLLoader(getClass().getResource("creatProduct.fxml"));
Pane myPane = (Pane) myLoader.load();
Scene scene = new Scene(myPane);
stage.setScene(scene);
prevStage.close();
setPrevStage(stage);
stage.show();
}
Sin embargo, solo puedo cambiar el escenario una vez. Por ejemplo, mi página predeterminada es cartHomePage.fxml. Cuando ejecuto el programa, primero voy a crear la etapa del producto. Después de eso, ya no puedo ir a ningún lado. El mensaje de error es:
java.lang.IllegalStateException: Location is not set.
and Null Pointer Exception
Puse el escenario después de cerrarlo y pasarlo. Me pregunto qué parte salió mal.
Gracias por adelantado.
Creo que el problema es un nombre de diseño incorrecto o una ruta de archivo de diseño no válida.
para IntelliJ, puede crear un directorio de recursos y colocar allí los archivos de diseño.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/sample.fxml"));
rootLayout = loader.load();
Eso me pasó a mí y encontré la solución. Si construye su proyecto con sus archivos .fxml en diferentes paquetes de la clase que tiene la línea de inicio ( Parent root = FXMLLoader.load(getClass().getResource("filenamehere.fxml"));
) y use una ruta relativa Las ventanas, excepto la primera, no se ejecutarán cuando ejecute el contenedor. Para mantenerlo corto, coloque el archivo .fxml en el mismo paquete con la clase que lo inicia y establezca la ruta de esta manera ("filenamehere.fxml") y debería funcionar bien.
Esto a menudo no es correcto para la ruta de ubicación. Es importante darse cuenta de que la ruta comienza desde el paquete actual en el que reside el código y no desde la raíz del proyecto. Siempre que obtenga esta ruta relativa correcta, debería poder evitar este error en este caso.
He tenido el mismo problema en mi aplicación JavaFX. Aún más extraño: en mi entorno de desarrollo de Windows, todo funcionó bien con el cargador de archivos fxml. Pero cuando ejecuté exactamente el mismo código en mi máscara Debian, recibí errores similares con "ubicación no establecida".
Leí todas las respuestas aquí, pero ninguna parecía realmente "resolver" el problema. Mi solución fue fácil y espero que ayude a algunos de ustedes:
Quizás Java se confunde con el método getClass () . Si algo se ejecuta en diferentes subprocesos o si su clase implementa alguna interfaz, puede llegar al punto en que el método getClass () devuelva una clase diferente a la suya. En este caso, su ruta relativa a creatProduct.fxml será incorrecta, porque su "are" no está en la ruta que usted cree que es ...
Por lo tanto, para estar seguro : Sea más específico e intente utilizar el campo de clase estático en su clase ( tenga en cuenta el YourClassHere.class ).
@FXML
public void gotoCreateProduct(ActionEvent event) throws IOException {
Stage stage = new Stage();
stage.setTitle("Shop Management");
FXMLLoader myLoader = new FXMLLoader(YourClassHere.class.getResource("creatProduct.fxml"));
Pane myPane = (Pane) myLoader.load();
Scene scene = new Scene(myPane);
stage.setScene(scene);
prevStage.close();
setPrevStage(stage);
stage.show();
}
Después de darme cuenta de esto, SIEMPRE lo haré así. ¡Espero que ayude!
Intenté una cosa rápida y simple:
Tengo dos paquetes -> app.gui
y app.login
En mi clase de inicio de sesión uso el mainview.fxml
de la app.gui
así que lo hice en el login.fxml
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../gui/MainView.fxml"));
Y funciona :)
La respuesta a continuación por CsPeitch y otros está en el camino correcto. Solo asegúrese de que el archivo fxml se esté copiando a su destino de salida de clase, o el tiempo de ejecución no lo verá. Compruebe el directorio de archivos de clase generado y vea si el archivo fxml está allí
Me encontré con el mismo problema. El programa funcionaba muy bien desde Eclipse a través del botón "Ejecutar", pero NO desde el JAR ejecutable que había exportado antes. Mi solución fue:
1) Mover la clase principal al paquete predeterminado
2) Establecer otra ruta para Eclipse, y otra mientras se ejecuta desde el archivo JAR (pegar esto en Main.java )
public static final String sourcePath = isProgramRunnedFromJar() ? "src/" : "";
public static boolean isProgramRunnedFromJar() {
File x = getCurrentJarFileLocation();
if(x.getAbsolutePath().contains("target"+File.separator+"classes")){
return false;
} else {
return true;
}
}
public static File getCurrentJarFileLocation() {
try {
return new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
} catch(URISyntaxException e){
e.printStackTrace();
return null;
}
}
Y después de eso en el método de inicio , tienes que cargar archivos como este:
FXMLLoader loader = new FXMLLoader(getClass().getResource(sourcePath +"MainScene.fxml"));
Funciona para mí en Eclipse Mars con e (fx) clipse plugin.
Obtuve esta excepción y la "solución" que encontré fue a través de Netbeans IDE, simplemente:
- Haga clic derecho -> "Limpiar y construir"
- Ejecutar proyecto de nuevo
No sé POR QUÉ funcionó, ¡pero lo hizo!
Para los usuarios de Intellij, mi problema era que el directorio donde tenía mis archivos fxml (src / main / resources) no estaba marcado como un directorio de "Recursos".
Abra la configuración del módulo / proyecto vaya a la pestaña de fuentes y asegúrese de que Intellij sepa que el directorio contiene archivos de recursos del proyecto.
Quiero decir algo como esto:
FXMLLoader myLoader = null; Scene myScene = null; Stage prevStage = null;
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("Shop Management");
myLoader = new FXMLLoader(getClass().getResource("cartHomePage.fxml"));
Pane myPane = (Pane) myLoader.load();
CartHomePageUI controller = (CartHomePageUI) myLoader.getController();
controller.setPrevStage(primaryStage);
myScene = new Scene(myPane);
primaryStage.setScene(myScene);
primaryStage.show();
}
Después de esto
public void setPrevStage(Stage stage){
this.prevStage = stage;
}
public void gotoCreateCategory(ActionEvent event) throws IOException {
Stage stage = new Stage();
stage.setTitle("Shop Management");
myLoader = new FXMLLoader(getClass().getResource("createCategory.fxml"));
Pane myPane = (Pane) myLoader.load();
Scene scene = new Scene(myPane);
stage.setScene(scene);
// prevStage.close(); I don''t think you need this, closing it will set preStage to null put a breakpoint after this to confirm it
setPrevStage(stage);
stage.show();
}
//Method to change scene when menu item create product is on click
@FXML
public void gotoCreateProduct(ActionEvent event) throws IOException {
Stage stage = new Stage();
stage.setTitle("Shop Management");
myLoader = new FXMLLoader(getClass().getResource("creatProduct.fxml"));
Pane myPane = (Pane) myLoader.load();
Scene scene = new Scene(myPane);
stage.setScene(scene);
// prevStage.close(); I don''t think you need this, closing it will set preStage to null put a breakpoint after this to confirm it
setPrevStage(stage);
stage.show();
}
Pruébalo y házmelo saber por favor.
Sé que esta es una respuesta tardía, pero espero ayudar a cualquier otra persona que tenga este problema. Obtuve el mismo error y descubrí que tenía que insertar un /
delante de mi ruta de archivo. La llamada a la función corregida sería entonces:
FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/createCategory.fxml"));
// ^
Tuve este problema y encontré esta publicación. Mi problema era solo un problema con el nombre del archivo.
FXMLLoader(getClass().getResource("/com/companyname/reports/" +
report.getClass().getCanonicalName().substring(18).replaceAll("Controller", "") +
".fxml"));
Parent root = (Parent) loader.load();
Tengo un xml del que proviene todo esto y me he asegurado de que mi clase sea la misma que el archivo fxml menos el controlador de palabras.
Rompí la subcadena por lo que el camino estaba mal ... después de arreglar el nombre del archivo funcionó.
Para abreviar, creo que el problema es que el nombre del archivo se llama incorrectamente o que la ruta es incorrecta.
ADICION: Desde entonces me he mudado a un Proyecto Maven. La forma no Maven es tener todo dentro de la ruta de su proyecto. La forma de Maven que figuraba en la siguiente respuesta fue un poco frustrante al principio, pero hice un cambio en mi código de la siguiente manera:
FXMLLoader loader = new FXMLLoader(ReportMenu.this.getClass().getResource("/fxml/" + report.getClass().getCanonicalName().substring(18).replaceAll("Controller", "") + ".fxml"));
Yo tuve el mismo problema. Es un problema simple de no especificar el camino correcto.
Haga clic derecho en el archivo .fxml
y seleccione propiedades (para aquellos que usan eclipse no será muy diferente para otro IDE) y luego copie la copia de la ubicación comenzando desde /packagename
hasta el final y eso debería resolver el problema
Yo tuve el mismo problema.
después de unos minutos, pensé que estaba intentando cargar el archivo .fxml desde la ubicación incorrecta.
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/[wrong-path]/abc.fxml"));
fxmlLoader.setClassLoader(getClass().getClassLoader());
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
fxmlLoader.load();
el mío era extraño ... IntelliJ peculiaridad específica.
Miré mis clases de salida y había una carpeta:
xyz
en lugar de
x / y / z
pero si tiene ciertas opciones establecidas en IntelliJ, en el navegador ambas se verán como xyz
así que revisa tu carpeta de salida si te estás rascando la cabeza
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../view/Main.fxml"));
en mi caso, simplemente eliminé ...
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/view/Main.fxml"));