2013-04-23 8 views
5

Mam wiele plików FXML, które utworzyłem w SceneBuilder i jeden plik kontrolera. Kiedy edytuję wartość (powiedzmy na przykład wartość całkowitą) w jednej scenie, a następnie przełączam sceny, ta wartość nie wydaje się być zmieniona w nowej scenie.Mieć wiele plików FXML (utworzonych w SceneBuilder), ale tylko jeden kontroler. Czy każda scena ładuje swoją własną kopię kontrolera?

Podczas ładowania pliku fxml dla sceny, czy mój program ładuje kopię pliku kontrolera tylko dla (i używa go tylko) tego pliku fxml?

Bardzo dziękuję za pomoc w udzieleniu odpowiedzi na to pytanie.

Odpowiedz

15

Twój plik kontrolera to plik źródłowy Java, który jest kompilowany do pojedynczej klasy Java, z której można utworzyć wiele instancji obiektów Java.

W środowisku wykonawczym domyślna implementacja kontrolera modułu ładującego fxml utworzy nową instancję kontrolera (np. Nowy obiekt) za każdym razem, gdy wywoływany jest moduł ładujący fxml-a o nazwie load method.

Nawet jeśli ładujesz ten sam plik fxml w kółko, program ładujący tworzy za każdym razem nową instancję kontrolera, z których każdy ma własny wewnętrzny stan niezależny od wszystkich pozostałych.

Podobnie, jeśli załadujesz różne pliki fxml, wszystkie wspierane przez tę samą klasę kontrolera - za każdym razem, gdy jakiś plik fxml, otrzymasz nową instancję kontrolera.


Aktualizacja odpowiedzieć na dodatkowe pytanie o dane kontrolera dzielenie

do wymiany informacji pomiędzy kontrolerami przy użyciu iniekcji zależność lub odrębną metodę inicjalizacji, patrz:

Passing Parameters JavaFX FXML

Ponadto, stosowanie z static class members pozwoli Ci udostępniać informacje. Po prostu nie używaj statycznego w połączeniu z @FXML, as that won't work.

Jest ładny samouczek do pracy z wieloma plikami fxml, które mogą okazać się pomocne:


Uwaga: to jest technicznie możliwe udostępniać jeden kontroler wśród wielu plików FXML

Jak zauważył w komentarzach Greg Brown:

możliwe jest, aby wykonywać większą kontrolę nad wykorzystaniem kontrolera instancji FXMLLoader#setController() i FXMLLoader#setControllerFactory().

Zdecydowanie nie zaleca się następujące podejście, które jest wyjaśnione w odpowiedzi na związane:

+0

Dzięki, jewelsea! Myślałem, że tak być może. Czy istnieje jakaś nowa instancja kontrolera dla każdego załadowanego pliku fxml, czy istnieje sposób, aby te instancje udostępniły informacje? A może gdybym przerobił mój program na różne kontrolery dla każdego pliku fxml, czy możesz uzyskać różne kontrolery do udostępniania informacji? – Aaron

+0

Odpowiedź została zaktualizowana za pomocą rozwiązania dodatkowego pytania. – jewelsea

+1

Skałasz, jubiler! Przyjrzę się teraz tym. Dziękuje bardzo!! – Aaron

Powiązane problemy