JavaFX - korzystanie z kilku plików *.fxml a kontroler

0

Próbuję działać w JavaFX i napotkałem taki problem: mam okno aplikacji w fxml. Po naciśnięciu przycisku chcę wyświetlić okno z innego pliku fxml, ale są tu 2 problemy:
-powtarzam wtedy wywołanie funkcji initialize kontrolera.
-za każdym razem przy wywoływaniu okienka od nowa wczytuję plik i je tworzę.

To raczej nie jest dobre podejście. Więc jak?

Mam jeszcze jedno pytanie, dlaczego stage w w ostatniej funkcji ma wartość null, jeżeli stworzyłem ten obiekt?

Tak wygląda kontroler

public class Controller {

    private Stage stage;

    @FXML
    private TextField entr;

    @FXML
    public void initialize() {
        System.out.printf("init");
    }

    @FXML
    private void addpress() {   /*uzytkownik chce wyswietlic okienko*/
        System.out.printf("addpress\n");

        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("view/dodaj_slowo.fxml"));
            Parent root2 = loader.load();
            stage = new Stage();
            stage.setScene(new Scene(root2));
            //stage.initModality(Modality.APPLICATION_MODAL);
            stage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @FXML
    private void add_return() {
        System.out.printf("add: " + entr.getText());

        /*
        if (stage == null)
            System.out.printf("dlaczego NULL?");
        stage.close();
        */

        Stage st = (Stage) entr.getScene().getWindow();
        st.close();
    }
}
0

Trochę malo kodu wrzuciłeś więc wróżenie z fusów ale:

powtarzam wtedy wywołanie funkcji initialize kontrolera

Jeden widok (plik *.fxml) - jeden kontroler. Za każdym razem jak powolujesz do życia scenę tworzysz nową instancję kontrolera. Jeżeli ubijasz jakiś widok i wyświatlasz go ponownie to jest już inne okno i wymaga nowej instancji kontrolera. Obsługa dwóch okien jednym kontrolerem to szatański pomysł. Jeżeli kontrolerze tworzącym potrzebujesz referencji do kontrolera okna tworzonego, np żeby przekazać jakieś parametry to masz jeszcze funkcję loader.getController()

za każdym razem przy wywoływaniu okienka od nowa wczytuję plik i je tworzę

No i co w tym złego? tak długo jak nie masz bardzo skomplikowanego layoutu dzieje się to wystarczająco szybko.

Mam jeszcze jedno pytanie, dlaczego stage w w ostatniej funkcji ma wartość null, jeżeli stworzyłem ten obiekt?

ten obiekt to się domyślam, że stworzyłeś w instancji kontrolera obsługującej pierwsze okno. W drugim oknie funkcja addpress() pewnie nie była wywolana.

0

ten obiekt to się domyślam, że stworzyłeś w instancji kontrolera obsługującej pierwsze okno. W drugim oknie funkcja addpress() pewnie nie była wywolana.

Dokładnie tak, to w sumie było oczywiste.

No i co w tym złego? tak długo jak nie masz bardzo skomplikowanego layoutu dzieje się to wystarczająco szybko.

No ale to zawsze będzie operacja dyskowa :P

Problem rozwiązany. Zrobiłem drugi kontroler dla okienka, w funkcji initialize pierwszego kontrolera tworzę nową scenę z pliku fxml, a potem za każdym żądaniem okienka wywołuję tylko show() na tej scenie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1