我正在使用TableLayout作为我的swing GUI。最初只需要一些基本标签,按钮和文本字段,我以后可以通过以下方式访问:
public Component getComponent(String componentName) {
return getComponent(componentName, this.frame.getContentPane());
}
private Component getComponent(String componentName, Component component) {
Component found = null;
if (component.getName() != null && component.getName().equals(componentName)) {
found = component;
} else {
for (Component child : ((Container) component).getComponents()) {
found = getComponent(componentName, child);
if (found != null)
break;
}
}
return found;
}
不幸的是,在使用JScrollPane
来支持JTextArea
和JTable的滚动之后我遇到了问题,我做了这些:
JTextArea ta = new JTextArea();
ta.setName("fooburg");
JScrollPane scr = new JScrollPane(ta);
frame.getContentPane().add(scr, "1, 1"); // EDIT: changed, tkx bruno
经过建议,我已经能够通过getComponent("fooburg")
访问所需的组件(上面的版本是最后一个版本)。非常感谢Dan和Bruno!
答案 0 :(得分:2)
您需要将子项添加到JFrame的内容窗格中:
frame.getContentPane().add(comp);
如果您直接将新组件添加到JFrame,则上面的代码永远不会得到它,因为您只是枚举frame.getContentPane()
下的组件。
答案 1 :(得分:2)
@bruno是对的 - 您需要将文本窗格添加到框架的内容窗格中。
略微OT:如果您通常想要访问层次结构中的每个组件,则需要递归的东西 - 您当前的方法只会打印直接的子名称:
void printNames(Component component) {
System.out.println(component.getName());
for (Component child : component.getComponents()) {
printNames(child);
}
}
void printFrameNamesComponents(JFrame frame) {
printNames(frame.getContentPane());
}
(未经过测试,但有类似的内容。)