2012-09-22 42 views
21

En this tutotial, es un ejemplo de cómo incluir componentes personalizados y utilizar sus controladores desde el controlador del contenedor.Controladores anidados JavaFx (FXML <include>)

main_window_content.fxml

<VBox fx:controller="com.foo.MainController"> 
    <fx:include fx:id="dialog" source="dialog.fxml"/> 
    ... 
</VBox> 

MainController.java

public class MainController extends Controller { 
    @FXML private Window dialog; 
    @FXML private DialogController dialogController; 

    .. 

Si el componente se incluye solamente una vez, funciona bien. Si el mismo componente se incluye en dos ocasiones, los controladores no se inicializan. Ambos controladores son nulos.

main_window_content.fxml

<VBox fx:controller="com.foo.MainController"> 
     <fx:include fx:id="dialog1" source="dialog.fxml"/> 
     <fx:include fx:id="dialog2" source="dialog.fxml"/> 
     ... 
    </VBox> 

MainController.java

public class MainController extends Controller { 
     @FXML private Window dialog1; 
     @FXML private DialogController dialogController1; 
     @FXML private Window dialog2; 
     @FXML private DialogController dialogController2; 

Podría alguien ayudarme a solucionar el problema? gracias

Este es mi código FXML carga. Se ejecuta en el método principal de la aplicación:

public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("main_window_content.fxml")); 
    stage.setTitle("FXML Welcome"); 
    stage.setScene(new Scene(root, 300, 275)); 
    stage.show(); 
} 
+0

La segunda respuesta es la solución correcta para esta pregunta, debe ser marcado como "Aceptada" –

+0

@AmirArad ¿Cuál es la "segunda"? – glglgl

Respuesta

29

Gracias a Daniel (de OTN) He encontrado el error en mi código, los nombres de mis variables de controlador estaban equivocados. Deberían ser <fx:id>Controller. En otras palabras, debe ser:

MainController.java

public class MainController extends Controller { 
@FXML private Window dialog1; 
@FXML private DialogController dialog1Controller; 
@FXML private Window dialog2; 
@FXML private DialogController dialog2Controller; 

Pero el estudio de la changes introdujo en la versión 2.2 me encontré con que todo se puede solucionar fácilmente mediante el uso de etiquetas <fx:root> (like this tutorial). entré en mi componente en FXML simplemente declarando así:

<HBox> 
    <Dialog id="dialog1" text="Hello World!"/> 
    <Dialog id="dialog2" text="Hello World!"/> 
</HBox> 

espero ser útil

+16

Además, marca de su propia respuesta como aceptada, para que sea más visible como la solución a su problema. Simplemente haga clic en la marca al lado de esta respuesta. –

1

Parece que hay un error en NetBeans 8.0 con fxmls anidados también. No se puede contar con NetBeans para crear el objeto controlador de la fxml anidada para usted, tiene que insertarse manualmente en su MainController. Cada vez que se actualiza el controlador en netbeans, se borra, por lo que puede ser tedioso. Para este ejemplo que serían la inserción de la línea de

@FXML private DialogController dialog1Controller; 

manualmente en el controlador principal en este caso, entonces funciona normalmente. Muy útil para organizar grandes controladores/fxmls.

Cuestiones relacionadas