JavaFX Integer Spinner(IntegerSpinnerValueFactory)不会将值环绕到最小值

时间:2018-12-27 21:14:09

标签: java javafx java-11 javafx-11

我用值创建了一个整数微调器

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

一旦微调器在递增过程中达到max (15)的值,就不会像在documentation中所说的那样将值重置为min (5),而是将其重置为值10 (max (15) - min (5))

  

public final void setWrapAround(布尔值)

     

设置属性wrapAround的值。

     

属性描述:

     

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

注意:递减正常工作,一旦达到min (5)值,微调器值就会自动设置为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);
  }
}

2 个答案:

答案 0 :(得分: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)); 
  } 

} 

注意:根据建议,对解决方法进行了一些修改。

答案 1 :(得分:-1)

我对IntegerSpinner也有类似的问题-但从-11绕到12(负到正)-达到-11或12时它返回零。解决方案是使用字符串使List微​​调器成为可能。因此,使用或设置将字符串转换为整数和vc所需的值。