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

时间:2019-06-15 22:52:52

标签: codenameone

出于调试目的,我想知道组件的哪些层次结构(或层次结构)放置在屏幕的给定位置,并知道X和Y的绝对值。

我还想知道这些组件中的哪个对屏幕的点击做出响应。

该应用在表单内部有一个表单,内部表单具有多个分层的窗格层。也有选项卡。在应用执行期间,许多组件以相同的形式添加和删除。布局是如此复杂,以至于使用组件检查器并不是一件容易的事,这就是为什么我想使用一种方法直接记录它在给定位置上放置的内容的原因。

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

谢谢您的建议。

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

2 个答案:

答案 0 :(得分:2)

我详细说明了Shai's answer,以实现我所要求的内容。我分享我已完成的工作,希望它会有用。我的代码有副作用和问题,但是对于一个临时测试来说,发现放置在给定位置的内容就足够了。

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

[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()的类的构造函数中调用Form。代码:

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;
    }

答案 1 :(得分:1)

使用类似的东西:

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

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