Вы столкнулись с особенностью JList
. Когда вы вводите каждый символ, JList
пытается прокрутить до записи, которая начинается с введенной вами буквы.
Таким образом, если вы ввели «Джо» и «Дейв», а затем попытались ввести «Джерри», JList
выберет строку «Джо».
См .: Отключить выбор букв в JList
Следуя методике из этого вопроса:
// Add these lines just before your first "addKeyListener"
for (KeyListener lsnr : serials.getKeyListeners()) {
if(lsnr.getClass().getSimpleName().equals("Handler")){
serials.removeKeyListener(lsnr);
}
}
Эти строки идут перед строкой 47 в вашем примере кода.
Это немного грубый способ убрать характер автоматического выбора JList
.
Слушатель, которого мы удаляем, добавляется к JList
на BasicListUI
в методе installListeners()
, как list.addKeyListener(getHandler())
. Обратитесь к источнику для BasicListUI
.
Класс, возвращаемый getHandler()
, является универсальным слушателем, который реализует несколько различных интерфейсов слушателя, включая KeyListener
, и именно здесь реализовано поведение автоматического выбора.
Нечетное использование getSimpleName()
для определения имени класса необходимо, потому что Handler
является закрытым классом в BasicListUI
, поэтому мы не можем использовать instanceof
.
Излишне говорить, что такого рода махинации создают довольно хрупкий код. Если вы хотите использовать этот подход, убедитесь, что вы хорошо его документировали и подготовились к его исправлению при переходе на будущие версии Java.
Если вы столкнулись с дизайном такого компонента, возможно, вы используете не тот компонент. Возможно, вам лучше использовать одну колонку JTable
.