JavaFX 8 日期选择器功能

Posted

技术标签:

【中文标题】JavaFX 8 日期选择器功能【英文标题】:JavaFX 8 DatePicker features 【发布时间】:2014-05-21 08:18:20 【问题描述】:

我刚开始使用新的 JavaFX 8 控件DatePicker。在DatePicker User Experience Documentation 中,据说它有几个我想在我的 GUI 应用程序中拥有的很酷的功能:

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

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

【问题讨论】:

【参考方案1】:

这是完整的实现:

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");
    


【讨论】:

我正在获取回历日历 - 但看到 1 天的不匹配...我该如何纠正它?我尝试更改时区,但没有更改它..请帮助 @AbdealiChandanwala 您可以通过提供自定义 Hijrah 变体来解决这个问题。你运行什么java版本? 请指导我如何实现这一点 - 因为我过去几个小时尝试检查它,但没有找到任何适合我的方法。感谢您的帮助 - 我是 java 8 并且没有 joda 时间 @AbdealiChandanwala 看看这个路径:C:\Program Files\Java\jdk1.8.0_162\jre\lib\hijrah-config-umalqura.properties 你可以手动更新它,否则你可以在运行时通过反射注入它(提出一个新问题,我会提供答案)。 谢谢 - 我试过你的链接,但后来我不得不发布一个新问题***.com/questions/51016469/…

以上是关于JavaFX 8 日期选择器功能的主要内容,如果未能解决你的问题,请参考以下文章

日期选择器在文本字段 iOS 8 上崩溃

日期选择器焦点功能

在日期选择器中选择日期之前触发功能

引导日期选择器禁用功能

Material UI 日期选择器 日期格式 React

flatpickr功能强大的日期时间选择器插件