Вопрос

Чтобы инициализировать все 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top