java - 如何根据焦点控件知道当前 "focused"是哪个顶层容器?

标签 java swing jpanel focus

我有一个应用程序,它显示一个 JFrame,其中有几个 JPanel (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);
    }
}

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

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

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

最佳答案

首先查看 KeyboardFocusManager#getFocusOwner要获取对焦点组件的引用,您需要循环访问每个父引用,直到它等于您的面板之一或父组件为 null

关于java - 如何根据焦点控件知道当前 "focused"是哪个顶层容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27281119/

相关文章:

java - 如何使用 javascript 在 JSP session 中设置值?

java - findViewById() 在第二个 Activity 中找不到 RecyclerView

java - 如何自定义 JComboBox 以便弹出窗口是 JTree(而不是列表)?

java - 仅在窗口调整大小完成后重绘 JPanel

java - 忽略反序列化中的计算字段

java - Amazon Lambda 上 Amazon Echo/Alexa 的正确 Java handleRequest() 方法签名?

java - 灵活的 Swing 输入对话框

java - 使用 ActiveJDBC 进行连接管理

java - 将 JRadioButton 添加到图形对象

java - JPanel不断地用paintComponent绘制自己