Reputation: 43
DatePicker is not updating after change date.
I was looking for an answer and i found this topic: JavaFX datepicker not updating value , but it doesn't work.
My listener for DatePicker:
public void datePickerListener() {
this.datePicker = new DatePicker();
this.datePicker.setShowWeekNumbers(false);
this.datePicker.setOnAction(event -> {
LocalDate date = this.datePicker.getValue();
System.out.println("Selected date: " + date);
});
}
Additionally I tried get data without listener like:
public void searchAvailableAppointments() {
LocalDate date;
String date2;
date = this.datePicker.getValue();
date2 = this.datePicker.getEditor().getText();
System.out.println(date);
System.out.println(date2);
}
Maybe anyone had similar problem and found workaround?
EDIT1:
I have created simple project to check behaviour of DatePicker:
Controller class:
package sample;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.DatePicker;
import java.net.URL;
import java.time.LocalDate;
import java.util.ResourceBundle;
public class Controller implements Initializable {
@FXML
DatePicker datePicker;
@Override
public void initialize(URL location, ResourceBundle resources) {
this.datePicker = new DatePicker();
}
public void pressButton() {
LocalDate date;
date = datePicker.getValue();
System.out.println(date);
}
}
FXML file:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.DatePicker?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="142.0" prefWidth="504.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
<children>
<DatePicker fx:id="datePicker" layoutX="65.0" layoutY="58.0" prefHeight="25.0" prefWidth="295.0" />
<Button layoutX="387.0" layoutY="59.0" mnemonicParsing="false" onAction="#pressButton" prefHeight="25.0" prefWidth="80.0" text="Print result" />
</children>
</AnchorPane>
Main class:
package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
But I have still no idea how to make it work.
Upvotes: 2
Views: 1819
Reputation: 36722
You should not re-initialize the DatePicker inside the initialize()
. When FXMLLoader loads the fxml, it instantiates all the fields and injects them into the references which are annotated with @FXML
.
If you re-initialize the field, the reference to the original object which is rendered on the view is lost and you are using the reference to the newly created object, therefore the value fetched from this object will always be null
.
@Override
public void initialize(URL location, ResourceBundle resources) {
// this.datePicker = new DatePicker(); <-- Should not exist
}
Upvotes: 5