JavaFX Integer Spinner (IntegerSpinnerValueFactory) не переносит значение до минимума - PullRequest
0 голосов
/ 28 декабря 2018

Я создал Integer Spinner со значениями

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

Как только счетчик достигает значения max (15) во время приращения, вместо сброса значения на 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 голосов
/ 26 января 2019

У меня похожая проблема с IntegerSpinner - но перенос от -11 до 12 (от отрицательного к положительному) - при достижении -11 или 12 он возвращается к нулю.Решением было сделать список блесны со строками.Так что, используя или устанавливая значения, мне нужно было преобразовать строку в целое число и vc.

0 голосов
/ 28 декабря 2018

Это известная ошибка: 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)); 
  } 

} 

Примечание. Обходное решение было слегка изменено в соответствии с рекомендациями.

...