pasar - Con una aplicación JavaFX en ejecución, abra una nueva ventana con su propia clase de controlador separada
manejo de ventanas javafx (2)
Estoy usando SceneBuilder junto con la biblioteca JavaFX de Netbeans para este proyecto. Yo uso Scenebuilder para crear el fxml y netbeans para las clases de controlador. El objetivo es construir una aplicación bastante compleja que se implementará.
Puedo lanzar una aplicación JavaFX y conectar la clase de controlador sin problemas. Sin embargo, cuando intento abrir una nueva ventana, parece que no puedo vincular una clase de controlador a la nueva ventana. Para mantener las cosas simples, me gustaría tener una clase de controlador separada para la nueva ventana debido a un complejo back-end.
TL; DR - Intenta abrir una nueva ventana en la aplicación JavaFX con una clase de controlador. La clase de controlador no es vinculante.
Ejemplos de código a continuación
Clase de modelo - contenedor para iniciar la aplicación
public class Model extends Application{
public static void main(String[] args){
Application.launch(Model.class, args);
}
@Override
public void start(Stage stage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("Sample.fxml"));
stage.setScene(new Scene(root));
stage.show();
}
}
Sample.fxml - archivo fxml para la aplicación principal
Sample.java - extiende Initializable, es la clase de controlador para Sample.fxml. A continuación se muestra un fragmento de código donde intento abrir la nueva ventana titulada "ServerConfigChooser"
try{
Parent root = FXMLLoader.load(getClass().getResource("ServerConfigChooser.fxml"));
FXMLLoader loader = new FXMLLoader(getClass().getResource("ServerConfigChooser.fxml"));
ServerConfigChooser controller = new ServerConfigChooser();
loader.setController(controller);
loader.setRoot(root);
Stage stage = new Stage();
stage.setScene(new Scene(root));
stage.show();
} catch (IOException ex)
ServerConfigChooser.java - implementa Inicializable
Aquí es donde tengo los problemas. No puedo simplemente declarar variables con el mismo fxid que las variables en el archivo .fxml. El método initialize () no se inicia cuando se llama a la clase.
El motivo para el constructor en la clase ServerConfigChooser es que no pude iniciar automáticamente el método initialize (). Disparo eso manualmente dentro del constructor.
¡Cualquier solución es bienvenida!
El problema aquí es, probablemente, cómo está cargando ServerConfigChooser
(me da la sensación de que el FXML está cargado dos veces o algo así). Lo siguiente debería funcionar:
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("ServerConfigChooser.fxml"));
ServerConfigChooser controller = new ServerConfigChooser();
loader.setController(controller);
Parent root = (Parent) loader.load();
Stage stage = new Stage();
stage.setScene(new Scene(root));
stage.show();
}
catch(...) {...}
También verifique que no especifique fx:controller
en ServerConfigChooser.fxml
(podría entrar en conflicto, en realidad no lo ha intentado).
No cargues el FXML dos veces así. Puede cargar varias veces el mismo documento .fxml (gráficos / controladores de múltiples escenas), pero si desea hacerlo en conjunto cargando el gráfico de escena e inicializando el controlador, debe llamar al cargador de fxml solo una vez.
Aquí hay un ejemplo
FXMLLoader loader = new FXMLLoader(getClass().getResource("ServerConfigChooser.fxml"));
ServerConfigChooser controller = new ServerConfigChooser();
loader.setController(controller);
loader.setRoot(controller);
Parent root;
try {
root = (Parent) loader.load();
Scene scene = new Scene(root, 320, 200);
Stage stage = new Stage();
stage.setScene(scene);
stage.show();
} catch (IOException ex) {
Logger.getLogger(ServerConfigChooser.class.getName()).log(Level.SEVERE, null, ex);
}
Tenga en cuenta que
- su controlador debe extender el tipo de nodo del nodo raíz de su documento .fxml
- su documento .fxml debe usar construcción fxroot, vea este documento (puede configurar esto en el generador de escenas)
- debe eliminar el controlador del elemento raíz fxml.
FXMLLoader
conflicto con esta forma de utilizar la claseFXMLLoader
Por ejemplo, la clase de controlador
public class ServerConfigChooser extends AnchorPane implements Initializable {
...
}
Y el .fxml
<fx:root type="javafx.scene.layout.AnchorPane" id="AnchorPane" prefHeight="200.0" prefWidth="320.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">