简体   繁体   中英

JavaFX - DatePicker always returns null

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.

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
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM