如何在 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,并且它不会执行您想要的操作。

请改用valueFactory属性的资源库:

hrsSpinner.setValueFactory(valueFactory);

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

hrsSpinner.valueFactoryProperty().set(valueFactory);

在这种情况下。

此外,我不建议混合使用Calendarjava.timeAPI。如果您有选择,请完全使用java.timeAPI。它提供了相同的功能,并且恕我直言,使用起来要容易得多。例如,假设您想使用日历将值截断为整小时,则可以改用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);

最新更新