цикл через JPanel
-
10-07-2019 - |
Вопрос
Чтобы инициализировать все JTextfField
на JPanel
, когда пользователи нажимают кнопку "Очистить", мне нужно перебрать JPanel
(вместо того, чтобы устанавливать все отдельные поля на " ").
Как я могу использовать цикл for-each для итерации по JPanel
в поисках JTextField
s?
Решение
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);
}
}
}
Редактировать . Примером предложения Тома Хоутина - tackline будет список в вашем классе фреймов:
List<JTextField> fieldsToClear = new LinkedList<JTextField>();
и когда вы инициализируете отдельные текстовые поля, добавьте их в этот список:
someField = new JTextField("Edit me");
{ fieldsToClear.add(someField); }
и когда пользователь нажимает кнопку очистки, просто:
for (JTextField tf : fieldsToClear) {
tf.setText("");
}
Другие советы
Хотя другой ответ показывает прямой способ решения вашей проблемы, ваш вопрос подразумевает плохое решение.
Как правило, статические зависимости между слоями должны быть односторонними. Вам нужно пройти через getCommponents
. Кастинг (при условии использования дженериков) - это простой способ увидеть, что что-то пошло не так.
Поэтому, когда вы создаете текстовые поля для формы, добавьте их в список, который нужно очистить в ходе операции очистки, а также добавьте их на панель. Конечно, в реальном коде есть и другие вещи, которые вы хотите с ними сделать. В реальном коде вы, вероятно, хотите иметь дело с моделями (возможно, Document
), а не с JComponent
s.