Вопрос по swing, java – цикл через JPanel

5

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

Как я могу использовать цикл for-each для того, чтобы перебратьJPanel в поискахJTextFields?

Ваш Ответ

2   ответа
1

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

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

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

+1 за идею иметь список интересных компонентов
Привет, спасибо большое. Это звучит впечатляюще, но я не знаю, как реализовать ваше решение. Конкретные примеры стоят 1000 слов. Очень ценится. Dallag.
И чтобы продвинуться дальше, я однажды попробовал решение на основе аннотаций для развлечения. Я аннотировал свои поля в классе с помощью @SaveContent и использовал рефлексивный подход для загрузки / сохранения содержимого аннотированных компонентов.
16
for (Component c : pane.getComponents()) {
    if (c instanceof JTextField) { 
       ((JTextField)c).setText("");
    }
}

вы можете использовать следующую рекурсивную форму:

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

Edit: Образец дляTom Hawtin - tackline предложение будет иметь список в вашем классе кадра:

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

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

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

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

for (JTextField tf : fieldsToClear) {
    tf.setText("");
}
Я проверил источник JComboBox и не вижу места, где JComboBox добавляет свой компонент редактора в свой список компонентов.
Спасибо большое kd304, это работало удовольствие. Просто нужно было добавить импорт java.awt. *; импорт javax.swing. *; import java.awt.Component;
Это тоже очищает поля со списком? (Между прочим, может быть статичным, кстати.)
JComboBox (расширяет JComponent) и JTextField (расширяет JTextComponent, который расширяет JComponent) находятся на двух разных путях
Да, прости. Я слишком привык к CTRL + SHIFT + O в Eclipse, чтобы организовать мой импорт.

Похожие вопросы