如何判断哪两个JList在Java Swing中有焦点?

时间:2014-04-25 20:38:22

标签: java swing jlist jcomponent

Snippet

嗨,我正在使用Java Swing构建一个简单的标记工具。组件中有两个JLists,每当我单击标记按钮时,我都想在给定文本中添加标记。如果我的光标焦点位于左侧JList上,我想修改左侧JList上的文本,如果它位于右侧,则修改右侧的JList。光标焦点的意思是我可以使用键盘箭头导航列表项的位置。

因此按钮侦听器应该判断当前光标焦点是在左侧Jlist还是右侧。我该怎么做?我已经尝试过使用“getFocusOwner”,但它会返回我刚刚点击的按钮。

1 个答案:

答案 0 :(得分:1)

虽然不是最优雅的方式,但您可以在FocusListener

中添加Jlist
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没有存储这类信息所以你必须自己存储它。