加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

JavaFX 8 DatePicker功能

发布时间:2020-12-14 05:57:36 所属栏目:Java 来源:网络整理
导读:我刚开始使用新的 JavaFX 8控件DatePicker.在 DatePicker User Experience Documentation中,它声称它有我想在GUI应用程序中使用的一些很酷的功能: 我想将格式从mm / dd / yyyy更改为dd / mm / yyyy. 我想限制可以选择的日期.用户只能从今天开始选择,直到明
我刚开始使用新的 JavaFX 8控件DatePicker.在 DatePicker User Experience Documentation中,它声称它有我想在GUI应用程序中使用的一些很酷的功能:

>我想将格式从mm / dd / yyyy更改为dd / mm / yyyy.
>我想限制可以选择的日期.用户只能从今天开始选择,直到明年的同一天.
>显示除原始日期之外的Hijri日期:

如何实现这些功能? JavaDoc并没有对它们说太多.

解决方法

这是完整的实现:
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");
    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读