Я пытался добиться следующего.JSpinner с пользовательским рендером
Я хочу использовать JSpinner, который использует числа для своих данных, но я хочу, чтобы он отображался следующим образом: «6/10», то есть «значение/максимум», где JSpinner по умолчанию показывает только «значение ». Конечно, я использую SpinnerNumberModel, чтобы работать с целыми числами как данные.
Я искал аналоговое поведение по сравнению с рендерером JCombobox и/или редактором, рендерером JTable и/или редактором, но, похоже, JSpinner не работает таким образом. Я нашел this example, для пользовательского контента внутри счетчика. В примере используется JLabel для отображения значков, но в моем случае я должен иметь возможность редактировать содержимое и проверять ввод после нажатия . Введите.
Так это то, что я в основном сделал:
JSpinner spinner = new JSpinner(new SpinnerNumberModel(1,1,10,1));
spinner.setEditor(new CustomSpinnerEditor(spinner));
где CustomSpinnerEditor расширяет JTextField. Я набросил на него некоторые свойства inputmap/actionmap (для введите), добавив ChangeListener к счетчику, чтобы иметь возможность обновлять содержимое текстового поля, когда пользователь нажимает на стрелки, добавил FocusListener, чтобы выбрать весь текст на focusGained и проверить вход на focusLost, ... и он работает.
Таким образом, проблема заключается не в том, чтобы заставить его работать. Проблема в том, что это слишком много работает для чего-то очень простого и что я могу потерять некоторые функции, не используя редактор по умолчанию. Если компонент просто предоставил возможность установить на него средство визуализации, у меня был бы крючок, где я просто возвращал JLabel с правильной строкой, как если бы я делал это с JComboBox.
Есть ли более простой способ достичь того, что я хочу?