5

ユーザーが「クリア ボタン」をクリックJTextfFieldしたときにすべてのを初期化するには、 (すべての個々のフィールドを「」に設定する代わりに) をループする必要があります。JPanelJPanel

JPanelsを検索して反復するために、for-each ループを使用するにはどうすればよいJTextFieldですか?

4

2 に答える 2

16
for (Component c : pane.getComponents()) {
    if (c instanceof JTextField) { 
       ((JTextField)c).setText("");
    }
}

しかし、JTextFields がより深くネストされている場合は、次の再帰形式を使用できます。

void clearTextFields(Container container) {
    for (Component c : container.getComponents()) {
        if (c instanceof JTextField) {
           ((JTextField)c).setText("");
        } else
        if (c instanceof Container) {
           clearTextFields((Container)c);
        }
    }
}

編集: Tom Hawtinのサンプル- タックラインの提案は、フレーム クラスにリストを含めることです。

List<JTextField> fieldsToClear = new LinkedList<JTextField>();

個々のテキスト フィールドを初期化するときに、それらを次のリストに追加します。

someField = new JTextField("Edit me");
{ fieldsToClear.add(someField); }

ユーザーがクリアボタンをクリックすると、次のようになります。

for (JTextField tf : fieldsToClear) {
    tf.setText("");
}
于 2009-06-24T08:45:42.503 に答える
1

別の回答はあなたの問題を解決する直接的な方法を示していますが、あなたの質問は解決策が不十分であることを暗示しています。

通常、レイヤー間の静的な依存関係は一方向にする必要があります。パックを通過する必要がありますgetCommponents。キャスト (ジェネリックを想定) は、何かが間違っていることを確認する簡単な方法です。

そのため、フォームのテキスト フィールドを作成するときは、それらをパネルに追加するだけでなく、クリア操作でクリアするリストに追加します。もちろん、実際のコードでは、おそらく他にもやりたいことがあります。Document実際のコードでは、sではなくモデル (おそらく ) を扱いたいと思うでしょうJComponent

于 2009-06-24T11:06:01.767 に答える