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