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

Codenameone 在给定位置记录组件层次结构,codenameone,Codenameone,出于调试目的,我想知道组件的哪个层次(或多个层次)被放置在屏幕的给定位置,知道绝对X和Y 我还想知道这些组件中的哪一个响应屏幕的点击 应用程序在表单中有一个表单,而内部表单有几个分层的窗格层。还有选项卡。在应用程序执行期间,许多组件以相同的形式添加和删除。布局非常复杂,组件检查器的使用非常重要,这就是为什么我想使用一个方法直接记录它放置在给定位置的内容 我将这样一个方法添加到全屏透明组件的操作侦听器中,用于调试添加到所有其他层顶部的分层窗格中 谢谢你的建议 (您认为可以通过某种方式将类似的功能添

出于调试目的,我想知道组件的哪个层次(或多个层次)被放置在屏幕的给定位置,知道绝对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.
只有当应用程序在模拟器上运行时,我才在扩展
表单的类的构造函数中调用
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;
    }

谢谢你,你给了我正确的暗示。我详细阐述了你的答案,并添加了另一个答案。