Как определить, какой JList среди двух имеет фокус курсора в Java Swing?

1

Изображение 174551

Привет, Я создаю простой инструмент тегов с помощью Java Swing. В компоненте есть два JLists, и всякий раз, когда я нажимаю кнопку тегирования, я хочу добавить тег к данному тексту. Если мой курсорный фокус находится слева JList, я хочу изменить текст слева JList, а если он справа, измените правый. То, что я подразумеваю под курсорным фокусом, - это место, где я могу перемещаться по элементам списка с помощью стрелок клавиатуры.

Таким образом, слушатель кнопки должен указать, находится ли текущий фокус курсора в левом списке Jlist или справа. Как мне это сделать? Я уже пытался использовать "getFocusOwner", но он возвращает кнопку, которую я только что нажал.

  • 0
    Ваша проблема в том, What I mean by cursor focus... это не "то, что JVM подразумевает под фокусировкой курсора". :)
Теги:
swing
jlist
jcomponent

1 ответ

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 не хранит такую информацию, поэтому вы должны ее хранить самостоятельно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню