4

我创建了一个带有值的整数微调器

min (5), max (15) and initialValue (12)wrapAround (true)

一旦微调器max (15)在增量期间达到该值,而不是min (5)按照文档中的说明将值重置为,而是将其重置为值10 (max (15) - min (5))

public final void setWrapAround​(布尔值)

设置属性 wrapAround 的值。

物业说明:

wrapAround 属性用于指定值工厂是否应该是循环的。例如,是否应该将基于整数的值模型从最大值增加到最小值(反之亦然)。

注意:Decrement 正常工作,一旦达到该min (5)值,Spinner 值自动设置为max (15)

public class IntSpinnerTest extends Application
{
  @Override
  public void start(Stage stage) throws Exception
  {
    var spinner = new Spinner<Integer>();

    var factory = new SpinnerValueFactory.IntegerSpinnerValueFactory(5, 15, 12);
    factory.setWrapAround(true);

    spinner.setValueFactory(factory);

    stage.setScene(new Scene(new BorderPane(spinner), 400, 200));

    stage.setTitle("IntSpinnerTest");
    stage.centerOnScreen();
    stage.show();
  }

  public static void main(String[] args)
  {
    launch(args);
  }
}
4

2 回答 2

3

这是一个已知的错误:JDK-8193286。提交者提供了一个解决方法——子类化IntegerSpinnerValueFactory

package sample; 

import javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory; 

public final class IntSpinnerValueFactory extends IntegerSpinnerValueFactory { 

  public IntSpinnerValueFactory(final int min, final int max) { 
    super(min, max); 
  } 

  public IntSpinnerValueFactory(final int min, final int max, final int initialValue) { 
    super(min, max, initialValue, 1); 
  } 

  @Override 
  public void increment(final int steps) { 
    final int min = getMin(); 
    final int max = getMax(); 
    final int currentValue = getValue(); 
    final int newIndex = currentValue + steps * getAmountToStepBy(); 
    setValue(newIndex <= max ? newIndex : (isWrapAround() ? (newIndex - min) % (max - min + 1) + min : max)); 
  } 

} 

注意:解决方法已根据建议稍作修改。

于 2018-12-27T21:34:59.643 回答
-1

我对 IntegerSpinner 有类似的问题 - 但从 -11 包装到 12(负到正) - 在达到 -11 或 12 时它返回到零。解决方案是使用字符串制作列表微调器。因此,使用或设置我需要将字符串转换为整数和 vc 的值。

于 2019-01-26T05:19:58.917 回答