/
victor_t
/
maze
Обзор
Документация
Войти
/
victor_t
/
maze
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
1
CI/CD
Аналитика
Безопасность
master
src/view/SpinnerUtils.java
126 строк
4 KB
Victor
relocated project folder
03 июл 2026, 03:14
03 июл 2026, 03:14
827638e
Код
Авторство
О чём код?
package view; import javafx.scene.control.Spinner; import javafx.scene.control.SpinnerValueFactory; import javafx.scene.control.TextFormatter; /** * Утилитный класс для настройки {@link javafx.scene.control.Spinner}. * * <p>Предоставляет методы для конфигурации спиннеров с числовыми значениями, * включая валидацию ввода и автоматическую корректировку значений.</p> */ public class SpinnerUtils { /** * Настраивает {@link Spinner} для работы с целыми числами. * * <p>Функциональность: * <ul> * <li>устанавливает диапазон значений (min–max)</li> * <li>задает начальное значение и шаг</li> * <li>разрешает ручной ввод</li> * <li>валидирует ввод (разрешены только целые числа)</li> * <li>автоматически исправляет значение при потере фокуса или вводе</li> * </ul> * </p> * * @param spinner спиннер для настройки * @param min минимальное значение * @param max максимальное значение * @param initial начальное значение * @param step шаг изменения значения */ public static void setupIntegerSpinner( Spinner<Integer> spinner, int min, int max, int initial, int step ) { SpinnerValueFactory.IntegerSpinnerValueFactory valueFactory = new SpinnerValueFactory.IntegerSpinnerValueFactory(min, max, initial, step); spinner.setValueFactory(valueFactory); spinner.setEditable(true); TextFormatter<Integer> formatter = new TextFormatter<>( valueFactory.getConverter(), initial, change -> { String newText = change.getControlNewText(); if (newText.isEmpty() || newText.matches("-?\\d*")) { return change; } return null; } ); spinner.getEditor().setTextFormatter(formatter); formatter.valueProperty().addListener((obs, oldVal, newVal) -> { if (newVal != null) { valueFactory.setValue(newVal); } }); Runnable fix = () -> fixValue(spinner, min, max, step, initial); spinner.focusedProperty().addListener((obs, oldVal, isFocused) -> { if (!isFocused) { fix.run(); } }); spinner.getEditor().setOnAction(e -> fix.run()); } /** * Корректирует значение спиннера в допустимых пределах. * * <p>Поведение: * <ul> * <li>ограничивает значение диапазоном [min, max]</li> * <li>округляет к ближайшему значению с учетом шага</li> * <li>при ошибке устанавливает начальное значение</li> * </ul> * </p> * * @param spinner спиннер * @param min минимальное значение * @param max максимальное значение * @param step шаг * @param initial значение по умолчанию при ошибке */ private static void fixValue( Spinner<Integer> spinner, int min, int max, int step, int initial ) { try { int value = Integer.parseInt(spinner.getEditor().getText()); value = Math.max(min, Math.min(max, value)); int remainder = (value - min) % step; value = value - remainder; if (remainder >= step / 2.0) { value += step; } value = Math.max(min, Math.min(max, value)); spinner.getValueFactory().setValue(value); } catch (Exception e) { spinner.getValueFactory().setValue(initial); } } }