Javafx, zepsute referencje, cuda na kiju

0

Cześć. Mam sobie aplikację i chcę dodać w niej popup, który jest osobnym okienkiem ze swoim kontrolerem i plikiem fxml.

Popup jest wywoływany w następujący sposób:


customTime.setOnAction(e -> Platform.runLater(() -> {

            Task task = getSelectedTask();
            
            new TimeAndDateController().display(task);
            
            setReminder(task);
        }));

Poniżej nieco wykastrowana klasa przedstawiająca popup:


public class TimeAndDateController {

    // ========================================================================================
    // Fields
    // ========================================================================================

    @FXML
    public VBox popupRoot = new VBox();

    @FXML
    public DatePicker datePicker = new DatePicker();

    @FXML
    public Button saveButton = new Button();

    @FXML
    public Button cancelButton = new Button();

    // -------------------------- Private fields ---------------------------------------------

    private final Stage popupStage = new Stage();

    private Task taskReference;


    // ========================================================================================
    // Methods
    // ========================================================================================


    public void display(Task task) {

        this.taskReference = task;

        initializeAndShowPopupStage();
    }

   // -------------------------- Event handling ---------------------------------------------

    @FXML	
    public void saveAndClose() {
        saveAndExit();
    }

    @FXML	
    private void closePopup() {
        popupStage.close();
    }
    
    // -------------------------- Private methods ---------------------------------------------


    private void initializeAndShowPopupStage() {

        setStageProperties();

        loadScene();

        initializeDatePicker();

        popupStage.showAndWait();
    }
    

    private void loadScene() {
        try {

            FXMLLoader loader = Utility.getFXMLLoader("fxml/timeAndDatePopup.fxml");

            popupScene = new Scene(loader.load());

            popupStage.setScene(popupScene);

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    

    private void setStageProperties() {
        popupStage.initModality(Modality.APPLICATION_MODAL);
        popupStage.setTitle("Time and Date");
        popupStage.initStyle(StageStyle.UNDECORATED);
    }


    private void initializeDatePicker() {
        datePicker.setValue(LocalDate.now());
  
    }
    

    private void saveAndExit() {
        if (taskReference != null) {

            var date = datePicker.getValue();
            
            taskReference.setDate(date);
        }
        popupStage.close();
    }
}

Poniżej wizja artystyczna samego popupa dla lepszego wyobrażenia sobie jak to ma wyglądać:

screenshot-20220710223108.png


Popup zgodnie z planem się pojawia i... Od tego momentu dzieje się cyrk, którego nie pojmuję: otóż klikając przycisk anuluj, popup powinien się zamykać, wywołując closePopup() i zamykając Stage'a - niemniej to się nie dzieje, co więcej nie dzieje się zupełnie nic, żadnego błędu, ani freeza. Nic.

INB4 - same eventy podpięte do guzików wstępnie działają - testowane za pomocą dupa-driven-debugging™ .

Co więcej, celowo zostawiłam jeden z node'ów - tu akurat date pickera, aby pokazać kolejny problem: nie sposób zainicjować elementu danymi. Tutaj próbuję to zrobić aktualną datą (initializeDatePicker()), co zazwyczaj działa, ale w tym przypadku z jakiegoś powodu, nie jestem wstanie tego zrobić dla żadnego z node'ów.


Mimo, że nie dostaję żadnych nullpointerów, to sprawdziłam, czy stage nie jest czasem nullem i niby nie jest, ale mimo, że ustawiłam tytuł stage'a na 'Time and Date', to
popupStage.getTitle() nie zwraca nic. Z kolei własności stage, takie jak popupStage.initStyle(StageStyle.UNDECORATED) czy popupStage.initModality(Modality.APPLICATION_MODAL) działają poprawnie. wtf?

Innymi słowy, niby obiekt tworzę, niby on tam sobie żyje, ale jak przychodzi co do czego, to nie ma z niego żadnego pożytku i nie mam zielonego pojęcia dlaczego. Dlaczego tak się dzieje i jak to można naprawić?

Z góry dziękuję za pomoc. :)

1

@calineczka: czemu robisz jakieś dziwolągi?


            new TimeAndDateController()

That's not the Jedi JavaFX way, jeśli ten controller jest powiązany z fxmlem.
Tak się otwiera nowe okienka:

private void showEditTagsForm(Track selectedTrack) throws Exception {
    FXMLLoader loader  = new FXMLLoader();
    loader.setLocation(getResource(EDIT_TAGS_FXML));
    Stage stage = new Stage();
    loader.setControllerFactory(clazz -> editTagsControllerFactory(stage, clazz, selectedTrack));
    Scene scene = new Scene(loader.load(), 300, 200);
    stage.setMinWidth(300);
    stage.setMinHeight(200);
    stage.setScene(scene);
    stage.show();
  }
0

@scibi_92: okej, zrobiłam podobnie tego co wkleiłeś:


  customTime.setOnAction(e -> Platform.runLater(() -> {
            Task task = getSelectedTask();

           try {
               FXMLLoader loader = Utility.getFXMLLoader("fxml/timeAndDatePopup.fxml");
               Stage popupStage = new Stage();

               loader.setControllerFactory(c -> TimeAndDateController.timeAndDateControllerFactory(popupStage, task));

               Scene scene = new Scene(loader.load());
               popupStage.setScene(scene);

               popupStage.showAndWait();
               
           } catch (Exception ex) {
               throw new RuntimeException(ex);
           }

        }));

I teraz tak: zamykanie sceny poprzez naciśnięcie przycisku działa (choć nadal nie rozumiem dlaczego), ale inicjalizacja node'ów danymi już nie. ;/

Nawet jeżeli umieszczę w konstruktorze metodę, która ustala datę w date pickerze na obecną, to pole date pickera jest puste.

private void initializeDatePicker() {
        datePicker.setValue(LocalDate.now());
    }

Tak samo jest z resztą node'ów jakie tam mam. Mimo to, nie dostaję żadnego wyjątku. Dlaczego tak się dzieje?

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