如何在 JavaFx 的微调器中显示本地时间(小时)

How to display (the hours of) a local time in a spinner in JavaFx

如何在微调器中设置 SpinnerValueFactory<LocalTime> valueFactory = new SpinnerValueFactory<LocalTime>() 的值?

尝试使用 hrsSpinner.getValueFactory().setValue(valueFactory); 在微调器编辑器中设置和显示值,Java 告诉我:

The method setValue(LocalTime) in the type SpinnerValueFactory<LocalTime> is not applicable for the arguments (SpinnerValueFactory<LocalTime>).

我尝试过的另一种方法是 hrsSpinner.setValueFactory(valueFactory);。我没有错误。但是在我单击微调器以增加或减少小时数之前,小时数最初不会显示在微调器编辑器中。

有什么办法可以解决我的问题吗?这是我正在使用的代码示例

Calendar calendar = new GregorianCalendar();
int hour;
this.hour = calendar.get(Calendar.HOUR_OF_DAY);

if(hourRadioButton.isSelected() == true) 
        {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh");    

            ObservableList<String> hours = FXCollections.observableArrayList(String.valueOf(hour));
            SpinnerValueFactory<LocalTime> valueFactory = new SpinnerValueFactory<LocalTime>() {

                {
                    setConverter(new LocalTimeStringConverter(formatter,null));
                }

                @Override
                public void decrement(int steps) {
                    if(getValue() == null)
                    {
                        setValue(LocalTime.now());
                    }
                    else
                    {
                        LocalTime localTime = (LocalTime) getValue();
                        setValue(localTime.minusHours(1));
                    }                   
                }

                @Override
                public void increment(int steps) {
                    if (this.getValue() == null)
                    {
                        setValue(LocalTime.now());
                    }
                    else 
                    {
                        LocalTime localTime = (LocalTime) getValue();
                        setValue(localTime.plusHours(1));
                    }               
                }               
            };

            //hrsSpinner.setValueFactory(valueFactory);
            hrsSpinner.getValueFactory().setValue(valueFactory);
        }

非常感谢您的宝贵时间和帮助!!! 阿维乔

hrsSpinner.getValueFactory() 是类型 SpinnerValueFactory<LocalTime> 的表达式。使用此参数无法在此使用 setValue,它不会执行您想要的操作。

使用 setter 代替 valueFactory 属性:

hrsSpinner.setValueFactory(valueFactory);

这种设置值工厂的方式似乎源于使用 属性 对象的 setter 而不是使用更简洁因此更易于解析的版本的不良做法 [= =33=]对应的是属性。使用 属性 对象的 setter 的版本将是

hrsSpinner.valueFactoryProperty().set(valueFactory);

在这种情况下。

此外,我不建议混合使用 Calendarjava.time API。如果您有选择,请完全选择 java.time api。它提供相同的功能并且更容易使用恕我直言。例如。假设您想使用日历将值截断为整小时,您可以改用 truncateTo

SpinnerValueFactory<LocalTime> factory = new SpinnerValueFactory<LocalTime>() {

    {
        setValue(defaultValue());
    }

    private LocalTime defaultValue() {
        return LocalTime.now().truncatedTo(ChronoUnit.HOURS);
    }

    @Override
    public void decrement(int steps) {
        LocalTime value = getValue();
        setValue(value == null ? defaultValue() : value.minusHours(steps));
    }

    @Override
    public void increment(int steps) {
        LocalTime value = getValue();
        setValue(value == null ? defaultValue() : value.plusHours(steps));
    }


};
Spinner<LocalTime> spinner = new Spinner<>();
spinner.setValueFactory(factory);