2

Swing GUI にTableLayoutを使用しています。最初は、必要に応じていくつかの基本的なラベル、ボタン、およびテキスト フィールドのみを使用して、後でアクセスできるようにしました。

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をサポートするために using を使用した後、問題が発生しました。

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に直接追加する場合、。の下のコンポーネントのみを列挙しているため、上記のコードは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 に答える