цикл через JPanel - PullRequest
       17

цикл через JPanel

5 голосов
/ 24 июня 2009

Для того чтобы инициализировать все JTextfField с на JPanel, когда пользователи нажимают «кнопку очистки», мне нужно выполнить цикл по JPanel (вместо того, чтобы устанавливать все отдельные поля на «»).

Как я могу использовать цикл for-each для итерации по JPanel в поисках JTextField s?

Ответы [ 2 ]

16 голосов
/ 24 июня 2009
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 - tackline предложение будет иметь список в вашем классе кадров:

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

и при инициализации отдельных текстовых полей добавьте их в этот список:

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

и когда пользователь нажимает кнопку очистки, просто:

for (JTextField tf : fieldsToClear) {
    tf.setText("");
}
1 голос
/ 24 июня 2009

Хотя другой ответ показывает прямой способ решения вашей проблемы, ваш вопрос подразумевает плохое решение.

Как правило, статические зависимости между слоями должны быть односторонними. Вам нужно пройти пакет через getCommponents. Кастинг (при условии использования дженериков) - это простой способ увидеть, что что-то пошло не так.

Таким образом, когда вы создаете текстовые поля для формы, добавьте их в список, который будет очищен в процессе очистки, а также добавьте их на панель. Конечно, в реальном коде есть и другие вещи, которые вы хотите с ними сделать. В реальном коде вы, вероятно, хотите иметь дело с моделями (возможно, Document), а не JComponent s.

...