Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaFX 8 DatePicker features

I just start using the new JavaFX 8 control DatePicker. In DatePicker User Experience Documentation, it is stated that it has couple of cool features that I would like to have in my GUI application:

  1. I want to change the format from mm/dd/yyyy to dd/mm/yyyy.
  2. I would like to restrict the date that can be selected. The user can only select from today until the same day of next year.
  3. Display Hijri dates besides the original ones:

enter image description here

How to implement these features? The JavaDoc doesn't say much about them.

like image 459
Eng.Fouad Avatar asked Apr 08 '14 14:04

Eng.Fouad


People also ask

How to make a DatePicker in Java?

DatePicker dp = new DatePicker(); Add both label and button using tilepane and datepicker.

What does a DatePicker return?

The calendar system used for parsing, displaying, and choosing dates in the DatePicker control. The default value is returned from a call to Chronology.


1 Answers

Here is the full implementation:

import java.net.URL;
import java.time.LocalDate;
import java.time.chrono.HijrahChronology;
import java.time.format.DateTimeFormatter;
import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.DateCell;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.util.Callback;
import javafx.util.StringConverter;

/**
 *
 * @author Fouad
 */
public class FXMLDocumentController implements Initializable
{
    @FXML
    private DatePicker dpDate;

    @Override
    public void initialize(URL url, ResourceBundle rb)
    {
        dpDate.setValue(LocalDate.now());
        dpDate.setChronology(HijrahChronology.INSTANCE);

        Callback<DatePicker, DateCell> dayCellFactory = dp -> new DateCell()
        {
            @Override
            public void updateItem(LocalDate item, boolean empty)
            {
                super.updateItem(item, empty);

                if(item.isBefore(LocalDate.now()) || item.isAfter(LocalDate.now().plusYears(1)))
                {
                    setStyle("-fx-background-color: #ffc0cb;");
                    Platform.runLater(() -> setDisable(true));

                    /* When Hijri Dates are shown, setDisable() doesn't work. Here is a workaround */
                    //addEventFilter(MouseEvent.MOUSE_CLICKED, e -> e.consume());
                }
            }
        };

        StringConverter<LocalDate> converter = new StringConverter<LocalDate>()
        {
            final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");

            @Override
            public String toString(LocalDate date)
            {
                if(date != null) return dateFormatter.format(date);
                else return "";
            }

            @Override
            public LocalDate fromString(String string)
            {
                if(string != null && !string.isEmpty())
                {
                    LocalDate date = LocalDate.parse(string, dateFormatter);

                    if(date.isBefore(LocalDate.now()) || date.isAfter(LocalDate.now().plusYears(1)))
                    {
                        return dpDate.getValue();
                    }
                    else return date;
                }
                else return null;
            }
        };

        dpDate.setDayCellFactory(dayCellFactory);
        dpDate.setConverter(converter);
        dpDate.setPromptText("dd/MM/yyyy");
    }

}
like image 83
Eng.Fouad Avatar answered Sep 19 '22 19:09

Eng.Fouad