Как определить, какой JList среди двух имеет фокус курсора в Java Swing?
Привет, я создаю простой инструмент тегирования с использованием Java Swing. В компоненте есть два JList, и всякий раз, когда я нажимаю кнопку тегирования, я хочу добавить тег к данному тексту. Если мой курсор находится на левом JList, я хочу изменить текст на левом JList, а если на правом - изменить правый. Под фокусом курсора я подразумеваю место, где я могу перемещаться по элементам списка с помощью стрелок на клавиатуре.
Поэтому слушатель кнопки должен сказать, находится ли текущий фокус курсора на левом Jlist или на правом. Как мне это сделать? Я уже пытался использовать "getFocusOwner", но он возвращает кнопку, которую я только что нажал.
1 ответ
Хотя это не самый элегантный способ, вы можете добавить FocusListener
на ваш Jlist
s
public class CheckFocus extends JFrame {
JList<String> focusedList = null;
JList<String> list1 = new JList<>(new String[]{"A", "B"});
JList<String> list2 = new JList<>(new String[]{"1", "2"});
CheckFocus() {
JButton btn = new JButton("Who has focus?");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (focusedList.equals(list1))
System.out.println("list1");
else if (focusedList.equals(list2))
System.out.println("list2");
else
System.out.println("none");
}
});
MyFocusListener mfl = new MyFocusListener();
list1.addFocusListener(mfl);
list2.addFocusListener(mfl);
getContentPane().add(list1, BorderLayout.LINE_START);
getContentPane().add(list2, BorderLayout.LINE_END);
getContentPane().add(btn, BorderLayout.CENTER);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
public static void main(String[] args) {
new CheckFocus();
}
class MyFocusListener extends FocusAdapter {
@Override
public void focusGained(FocusEvent e) {
super.focusGained(e);
focusedList = (JList<String>) e.getSource();
}
}
}
Если вы выберете ячейку в каждом списке, а затем нажмете кнопку, JVM будет обрабатывать списки одинаково - в данный момент они не имеют фокуса. То, что вы хотите, это знать, какой фокус был перед тем, как вы нажали кнопку, но JVM не хранит такую информацию, поэтому вы должны хранить ее самостоятельно.