2

我将TableLayout用于我的摇摆 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;
}

不幸的是,我在使用 usingJScrollPane支持滚动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")所需的组件访问(上面的版本是最终版本)。非常感谢丹和布鲁诺!

4

2 回答 2

2

您需要将孩子添加到 JFrame 的内容窗格中:

frame.getContentPane().add(comp);

如果您直接将新组件添加到 JFrame,则上面的代码永远不会用到它,因为您只是在枚举frame.getContentPane().

于 2008-12-15T12:41:28.763 回答
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());
}

(未经测试,但类似这样。)

于 2008-12-15T13:02:10.250 回答