Java JFrame:如何通过组件递归解析(即,如果使用JScrollPane)

时间:2008-12-15 12:19:30

标签: java swing jscrollpane jtextarea tablelayout

我正在使用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!

2 个答案:

答案 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());
}

(未经过测试,但有类似的内容。)