在给定位置记录组件层次结构

Logs components hierarchies at a given positon

出于调试目的,我想知道组件的哪个层级(或层级)被放置在屏幕的给定位置,知道绝对的 X 和 Y。

我还想知道这些组件中的哪些组件会响应屏幕的点击。

该应用程序在一个表单中有一个表单,并且内部表单有多个分层窗格层。还有标签。在应用程序执行期间,在同一个表单中添加和删除了很多组件。布局是如此复杂以至于组件检查器的使用不是微不足道的,这就是为什么我想使用一种方法来直接记录它在给定位置放置的内容。

我想象一个这样的方法被添加到全屏透明组件的动作监听器中,用于调试添加到所有其他层顶部的分层窗格中。

感谢您的任何建议。

(您认为可以通过某种方式将类似的功能添加到模拟器中吗?)

使用类似的东西:

Component cmp = parentForm.getComponentAt(x, y);

这是可点击的组件。要获取层次结构,请递归使用 cmp.getParent() 来获取完整路径。

我详细阐述了 以实现我所要求的内容。我分享我所做的,希望它有用。我的代码有副作用和问题,但是临时测试以发现放置在给定位置的内容就足够了。

以下代码生成的日志示例,单击文本:

[EDT] 0:2:53,552 - You CLICKED on:
-> TextArea[x=4 y=14 width=215 height=96 name=null]
Hierarchy:
-> SpanLabel[x=0 y=0 width=219 height=124 name=null, layout = BorderLayout, scrollableX = false, scrollableY = false, components = [Label, TextArea]]
-> Container[x=0 y=92 width=219 height=124 name=null, layout = BoxLayout, scrollableX = false, scrollableY = false, components = [SpanLabel]]
-> Container[x=3 y=3 width=219 height=308 name=null, layout = BorderLayout, scrollableX = false, scrollableY = false, components = [Container]]
etc.

我在扩展 Form 的 class 的构造函数中调用 addLogForClicks(),仅当应用程序在模拟器上为 运行 时。代码:

private void addLogForClicks() {
        Container layer = this.getLayeredPane(BaseForm.class, 99);
        layer.setLayout(new BorderLayout(BorderLayout.CENTER_BEHAVIOR_SCALE));
        Button btn = new Button("", "NoMarginNoPadding");
        btn.addPointerPressedListener(l -> {
            Component cmp = this.getContentPane().getComponentAt(l.getX(), l.getY());
            Log.p("You CLICKED on:\n-> " + cmp + "\nHierarchy:\n" + getHierarchy(cmp), Log.DEBUG);
            if (cmp.respondsToPointerEvents()) {
                cmp.pointerPressed(l.getX(), l.getY());
            }
            if (cmp instanceof Container && ((Container) cmp).getLeadParent() != null && ((Container) cmp).getLeadParent().getLeadComponent() != null) {
                ((Container) cmp).getLeadParent().getLeadComponent().pointerPressed(l.getX(), l.getY());
            }
        });
        btn.addPointerReleasedListener(l -> {
            Component cmp = this.getContentPane().getComponentAt(l.getX(), l.getY());
            if (cmp.respondsToPointerEvents()) {
                cmp.pointerReleased(l.getX(), l.getY());
            }
            if (cmp instanceof Container && ((Container) cmp).getLeadParent() != null && ((Container) cmp).getLeadParent().getLeadComponent() != null) {
                ((Container) cmp).getLeadParent().getLeadComponent().pointerReleased(l.getX(), l.getY());
            }
        });
        layer.add(BorderLayout.CENTER, btn);

    }

    private String getHierarchy(Component cmp) {
        String result = "";
        if (cmp.getParent() != null && !(cmp.getParent() instanceof Form)) {
            result = "-> " + cmp.getParent() + "\n" + getHierarchy(cmp.getParent());
        }
        return result;
    }