Привет, Я создаю простой инструмент тегов с помощью Java Swing. В компоненте есть два JLists, и всякий раз, когда я нажимаю кнопку тегирования, я хочу добавить тег к данному тексту. Если мой курсорный фокус находится слева JList, я хочу изменить текст слева JList, а если он справа, измените правый. То, что я подразумеваю под курсорным фокусом, - это место, где я могу перемещаться по элементам списка с помощью стрелок клавиатуры.
Таким образом, слушатель кнопки должен указать, находится ли текущий фокус курсора в левом списке Jlist или справа. Как мне это сделать? Я уже пытался использовать "getFocusOwner", но он возвращает кнопку, которую я только что нажал.
Хотя это не самый элегантный способ, вы можете добавить 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 не хранит такую информацию, поэтому вы должны ее хранить самостоятельно.
What I mean by cursor focus...
это не "то, что JVM подразумевает под фокусировкой курсора". :)