Я думал об этой проблеме. Вот мое предложение:
public class ComponentTreeBuilder{
private Map<String, Component> hashMap = new HashMap<String,Component>();
public Map<String, Component> getComponentsTree(){
return hashMap;
}
public void visitComponent(Component cmp){
// Add this component
if(cmp != null) hashMap.put(cmp.getName(), cmp);
Container container = (Container) cmp;
if(container == null ) {
// Not a container, return
return;
}
// Go visit and add all children
for(Component subComponent : container.getComponents()){
visitComponent(subComponent);
}
}
}
И используйте это так:
Frame myFrame = new JFrame();
// Make sure you add your elements into the frame's content pane by
myFrame.getContentPane(component);
ComponentTreeBuilder cmpBuilder = new ComponentTreeBuilder();
cmpBuilder.visitComponent(myFrame);
Map<String, Component> components = cmpBuilder.getComponentsTree();
// All components should now be in components hashmap
Обратите внимание, что ComponentTreeBuilder
использует рекурсию, это может вызвать исключение переполнения стека, если в вашем графическом интерфейсе слишком много компонентов.
РЕДАКТИРОВАТЬ Только что проверил этот код на реальном примере и ... он работает:)
Вот код:
JFrame frame = new JFrame();
frame.getContentPane().add(new JButton());
frame.getContentPane().add(new JButton());
frame.getContentPane().add(new JButton());
frame.getContentPane().add(new JButton());
visitComponent(frame);
А вот и вывод:
