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ć:
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. :)
- screenshot-20220710223108.png (7 KB) - ściągnięć: 42