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

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

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

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

【问题讨论】:

    标签: java datepicker javafx-8 fxml hijri


    【解决方案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 你可以手动更新它,否则你可以在运行时通过反射注入它(提出一个新问题,我会提供答案)。
    • 谢谢 - 我试过你的链接,但后来我不得不发布一个新问题stackoverflow.com/questions/51016469/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2023-03-09
    • 2018-01-07
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多