你也可以传入一个谓词,它允许任何类型的选择。
Predicate<Node> p= n -> null ≃ n.getId() && n instanceof TextInputControl
将获得所有 TextFields 和 TextAreas。
您可以将其全部打包在一个接口中,Java 8 样式,然后您只需要Parent getRoot()
在 Pane 或其他容器中实现。
@FunctionalInterface
public interface FXUIScraper {
// abstract method.
Parent getRoot();
default List<Node> scrape( Predicate<Node> filter ) {
Parent top = getRoot();
List<Node> result = new ArrayList<>();
scrape( filter, result, top );
return result;
}
static void scrape( Predicate<Node> filter, List<Node> result, Parent top ) {
ObservableList<Node> childrenUnmodifiable = top.getChildrenUnmodifiable();
for ( Node node : childrenUnmodifiable ) {
if ( filter.test( node ) ) {
result.add( node );
}
if ( node instanceof Parent ) {
scrape( filter, result, (Parent)node );
}
}
}
}
假设您的窗格称为窗格:
FXUIScraper scraper = () ->pane;
List<Node> textNodesWithId =
scraper.scrape(n -> null ≃ n.getId()
&& n instanceof TextInputControl);
如果您有有意义的 id,例如实体的字段名称或 json 对象中的键名,则将结果处理为所需的形式变得微不足道。github上有一个项目,其中包含 fxuiscraper作为一个单独的项目。