JavaFX - DatePicker always returns null

亡梦爱人 提交于 2019-12-12 19:33:35

问题


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.


回答1:


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
}


来源:https://stackoverflow.com/questions/33657521/javafx-datepicker-always-returns-null

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!