JPanelをループする
-
10-07-2019 - |
質問
ユーザーが「クリアボタン」をクリックしたときに、 JPanel
のすべての JTextfField
を初期化するには、 JPanel
をループする必要があります。 >(すべての個々のフィールドを""に設定する代わりに)。
JTextField
を検索して JPanel
を反復処理するためにfor-eachループを使用するにはどうすればよいですか?
解決
for (Component c : pane.getComponents()) {
if (c instanceof JTextField) {
((JTextField)c).setText("");
}
}
しかし、より深くネストされたJTextFieldがある場合は、次の再帰形式を使用できます。
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("");
}
他のヒント
別の答えがあなたの問題を解決する直接的な方法を示している間、あなたの質問は貧弱な解決策を暗示しています。
一般に、レイヤー間の静的な依存関係を一方向にする必要があります。 getCommponents
を介してパックを実行する必要があります。キャスト(ジェネリックを想定)は、何かが間違っていることを確認する簡単な方法です。
したがって、フォームのテキストフィールドを作成するとき、それらをクリア操作でクリアするリストに追加し、パネルに追加します。もちろん、実際のコードには、おそらく他にもやりたいことがあります。実際のコードでは、おそらく JComponent
sではなく、モデル(おそらく Document
)を扱いたいでしょう。
所属していません StackOverflow