如何知道目前哪个顶级容器"重点关注"根据重点控制?

时间:2014-12-03 20:36:27

标签: java swing jpanel focus

我有一个应用程序,它显示一个JFrame,里面有几个JPanels(A)。每个JPanel A都有一些控件,还有一些复杂的组件包含额外的控件。现在,我的应用程序需要知道正在使用JPanel A中包含的哪一组控件,因此它可以突出显示JPanel A.

以下是一些代码示例:

public class MyApp extends JFrame
{
    private JPanel A1 = new JPanel();
    private JPanel A2 = new JPanel();
    private JPanel A3 = new JPanel();

    public MyApp()
    {
        // Add components to the layout, initialize things, etc
        ...

        // Lets suppose each JPanel has 2 components
        JComponent C1 = new JComponent();
        JComponent C2 = new JComponent();
        A1.add(C1);
        A1.add(C2);

        JComponent C3 = new JComponent();
        JComponent C4 = new JComponent();
        A2.add(C3);
        A2.add(C4);

        JComponent C5 = new JComponent();
        JComponent C6 = new JComponent();
        A3.add(C5);
        A4.add(C6);
    }
}

所以我想知道的是,根据使用哪个JComponent,哪个JPanel(A1,A2或A3)当前“聚焦”了。一个重要的事情是我不能直接访问主框架中的所有控件,因为那些JComponent被定义为我的应用程序中的其他位置的类。我可以修改那些,但我不能说“如果它是C1里面的textfield1,那么就是A1”。

我一直在阅读,到目前为止,我认为我要做的是实现一个PropertyChangeListener(如Focus子系统文档中Tracking Focus Changes to Multiple Components部分所示),以跟踪每个内部控件的焦点面板,然后将该信息发送到我的应用程序。

有没有更好的方法来做到这一点,我不知道呢? 非常感谢。

1 个答案:

答案 0 :(得分:2)

首先查看KeyboardFocusManager#getFocusOwner以获取对焦点组件的引用,然后循环遍历每个父引用,直到它等于某个面板或父节点为{{1} }