Есть небольшое оконное приложение на Swing. На форме JFrame form расположены текстовые поля и объект jSpinner spinner. При завершении ввода нового значения в spinner по нажатию клавиши Enter значения в текстовых полях должны быть изменены (новые значения берутся из заранее созданной коллекции ArrayList по индексу, зависящему от введённого в spinner значения).
Проблема в навешивании слушателя на нужный объект. Если делать так, как показано в коде ниже, KeyListener работает некорректно: вместо того, чтобы активировать событие, первое нажатие клавиши Enter просто завершает ввод нового значения. Уже только если повторно нажать Enter при активном поле spinner, произойдёт обновление формы.
((JSpinner.DefaultEditor)form.spinner.getEditor()).getTextField()
.addKeyListener(new SpinnerEnterPressed());
обработчик:
public class SpinnerEnterPressed implements KeyListener
{
public void keyPressed(KeyEvent evt)
{
if(evt.getKeyCode() == KeyEvent.VK_ENTER)
{
//обновить значения в форме
refreshForm();
}
}
public void keyReleased(KeyEvent evt){}
public void keyTyped(KeyEvent evt){}
}
В принципе можно обойтись навешенным на spinner слушателем ChangeListener, но тогда refreshForm() срабатывает каждый раз при смене значения в поле spinner'a, чего хотелось бы избежать, например, чтобы программа не обновляла лишний раз значения в полях при прокрутке spinner'a стрелочками.
Существует ли рабочее решение для KeyListener?
Сборка персонального компьютера от Artline: умный выбор для современных пользователей