Java блокирует фокус от JComponent
Я сделал графический интерфейс для своего приложения. JFrame имеет 2 JPanels, панель 1 и панель 2. panel1 - это просто JPanel с пользовательской картиной, которая перерисовывает себя каждые 5 мс.
panel2 - моя первая попытка реализации CardLayout: она содержит JPanels subPanel1 & subPanel2. subPanel1 содержит JComboBox и добавляется в panel2:panel2.add(subPanel1);
.
SubPanel2 имеет.setLayout(new CardLayout());
команда, и я добавляю 3 новых JPanels в него, с подходящим itemListener и все. Конечно, я также добавлю это:panel2.add(subPanel2);
Теперь к проблеме: фокусировка компонентов в Java. У меня есть знание методовsetFocusable(boolean)
а такжеrequestFocus()
, Но я не могу заставить их вести себя каким-либо логическим образом.
Во-первых, коренная проблема всех них: когда поле со списком получает фокус, я вообще не могу его расфокусировать (пробовал щелкать везде курсором).
Ниже приведены эксперименты, которые я провел:
1) без какого-либо кода, говорящего о фокусировке по всему приложению, комбинированный список начинается с фокуса, независимо от того, какой порядок panel1 и panel2 добавляются в JFrame.
2) если я установлюpanel1.setFocusable(true);
(в своем конструкторе) он начнется с фокуса
3) если я установлюpanel1.setFocusable(false);
а также просить сосредоточиться на этом, он не понимает. (единственное, что работает как положено)
4) если я установлю панель 2, subPanel1 или subPanel2 не на фокусировку по отдельности или в любой комбинации, они все равно могут получить фокус (то есть выпадающий список, то есть единственный компонент, способный зарегистрировать фокус).
5) если я установил, что поле со списком не сфокусировано, я по-прежнему смогу прокручивать карты в CardLayout с помощью элемента itemListener, но фокус не прилипает к нему. На самом деле панель 1 все еще регистрирует клавиатурные вводы
Так что на самом деле я очень смущен всей этой «фокусировкой». Может быть, это не то, что я предполагаю? То, что я пытаюсь сделать, это полностью заблокировать все взаимодействие с panel2, пока флаг (который оценивается каждые 5 мс) не является истинным. Правильно ли я предполагаю, что в отличие от JPanels, JComboBox автоматически имеет mousebuttonListener, чтобы получить фокус при нажатии? если нет, то как полностью отключить JComboBox и все компоненты, отображаемые на текущей карте? Это нормальное поведение, что компоненты внутри нефокусируемого компонента все еще могут быть сфокусированы?