2012-09-22 18 views
21

W języku angielskim jest przykładem, jak dołączyć niestandardowe komponenty i używać ich kontrolerów z kontrolera kontenera.Kontrolery zagnieżdżone 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; 

    .. 

Jeśli składnik jest zawarty tylko raz, to działa dobrze. Jeśli ten sam komponent jest uwzględniony dwukrotnie, kontrolery nie są inicjowane. Oba kontrolery mają wartość NULL.

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; 

Może ktoś mi pomóc rozwiązać ten problem? dziękuje

To jest mój kod ładowania FXML. Jest on wykonany w głównej metody aplikacji:

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

Druga odpowiedź jest właściwym rozwiązaniem dla tego pytania. Powinna być oznaczona jako "Zaakceptowana". –

+0

@AmirArad Która z nich jest "druga"? – glglgl

Odpowiedz

29

Dzięki Daniel (od OTN) Znalazłem błąd w moim kodu, nazwy moich zmiennych regulatora były błędne. Powinny one być <fx:id>Controller. Innymi słowy powinno być:

MainController.java

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

Ale studiując changes wprowadzone w wersji 2.2 Okazało się, że wszystko da się łatwo rozwiązać za pomocą <fx:root> tag (like this tutorial). wszedłem mój komponent w FXML prostu deklarując to tak:

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

mam nadzieję być pomocne

+16

Oznacz także własną odpowiedź jako zaakceptowaną, aby była bardziej widoczna jako rozwiązanie twojego problemu. Po prostu kliknij zaznaczenie obok tej odpowiedzi. –

1

Wydaje się, że to błąd w NetBeans 8.0 z zagnieżdżonych fxmls również. Nie można liczyć na atrybuty net do tworzenia zagnieżdżonego obiektu kontrolera fxml dla ciebie, musi on zostać ręcznie wstawiony do twojego kontrolera MainController. Za każdym razem, gdy kontroler jest aktualizowany w netbeans, zostaje on usunięty, co może być nudne. W tym przykładzie, które są wstawienie linii

@FXML private DialogController dialog1Controller; 

ręcznie do głównego sterownika w tym przypadku, to nie działa prawidłowo. Bardzo przydatne do organizowania dużych fxmls/kontrolerów.

Powiązane problemy