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

Другие вопросы по тегам