如何在微调器中设置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);
在这种情况下。
此外,我不建议混合使用Calendar
和java.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);