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