Java получить компоненты JPanel

У меня есть JPanel, полный JTextFields...

for (int i=0; i<maxPoints; i++) {
    JTextField textField = new JTextField();
    points.add(textField);
}

Как мне позже получить JTextFields в этой JPanel? Например, если я хочу, чтобы их значения

TextField.getText();

Спасибо


person Devoted    schedule 16.12.2008    source источник
comment
Я должен сказать, что никто не благодарит за удаление этих логотипов Apple и подписи СПАСИБО.   -  person Paul Tomblin    schedule 16.12.2008


Ответы (7)


Имейте в виду, что они не попали туда сами по себе (я думаю, я прочитал несколько вопросов о динамическом создании этих панелей во время выполнения)

В опубликованных там ответах кто-то сказал, что вы должны сохранять ссылку на эти текстовые поля в массиве. Это именно то, что вам нужно здесь:

List<JTextField> list = new ArrayLists<JTextField>();

// your code...
for (int i=0; i<maxPoints; i++) { 
    JTextField textField = new JTextField();
    points.add(textField);
    list.add( textField ); // keep a reference to those fields.
}

// Позже

for( JTextField f : list ) { 
   System.out.println( f.getText() ) ;
}

Разве это не было легко?

Просто помните, что такие артефакты (список) должны быть как можно более закрытыми. Они предназначены только для вашего контроля, я не думаю, что они относятся к интерфейсу.

Допустим, вы хотите получить массив текстов вместо

 public List<JTextField> getFields();

Вы должны учитывать:

 public List<String> getTexts(); // get them from the textfields ... 
person OscarRyz    schedule 16.12.2008

Каждая панель JPanel в Java также является контейнером AWT. Таким образом, вы должны иметь возможность использовать getComponents для получения массива содержащихся в панели компонентов, перебирать их, проверять их типы (чтобы убедиться, что вы не получили другие элементы управления) и делать с ними все, что вам нужно.

Однако, как правило, это плохой дизайн. Если вы знаете, что вам потребуется доступ к определенным компонентам, лучше поддерживать массив этих текстовых полей и передавать его, даже если они визуально содержатся внутри контейнера.

Если это повторяющаяся задача или ее можно выполнять из нескольких точек, может даже иметь смысл иметь специальный класс, представляющий панель с текстовыми полями, который затем будет предоставлять через свой интерфейс средства доступа к этим полям.

person Uri    schedule 16.12.2008
comment
Я понимаю, что это древнее, но почему это плохой дизайн? Панель имеет контейнер с принадлежащими ей вещами. Если я хочу знать, чем он владеет, почему бы мне не использовать это? Зачем мне дублировать работу, которую он уже сделал? - person Scott M; 24.04.2020

Это то, что я сделал, чтобы рекурсивно пройти через контейнер и получить текстовые поля, которые находятся на JPanels.

private void ClearAllFields(Container myContainer) {

    Component myComps[] = myContainer.getComponents();

    for (int i=0; i<myComps.length; i++) {
      if(myComps[i] instanceof JPanel) {
          JPanel myPanel = (JPanel) myComps[i];
          ClearAllFields(myPanel);
      }
      if(myComps[i] instanceof JTextField) {
        JTextField myTextField = (JTextField) myComps[i];
        myTextField.setText("");
      }
    }        
}

И затем, чтобы использовать его, вы называете это так

ClearAllFields([jdialog or jframe etc].getContentPane());
person NetCollector    schedule 11.10.2017
comment
Эта функция была очень полезна для моего случая использования! Хотя я обновил его, чтобы он также рекурсировал в Box, добавив что-то вроде if(myComps[i] instanceof Box) { ClearAllFields((Box)myComps[i]); } - person Steven; 27.06.2019

Вы должны вызвать метод getComponents, который возвращает массив всех элементов на вашей панели JPanel. После этого вы можете перебрать массив и проверить, совпадает ли он с искомым компонентом.

List<JTextField> list = new ArrayLists<JTextField>();
Component[] components = panel.getComponents();

for (Component component : components) {
    if (component.getClass().equals(JTextField.class)) {
        list.add((JTextField)component);
    }
}
person Akros    schedule 20.11.2015
comment
можно ли получить этот компонент с его объявленным именем? Я имею в виду имя переменной компонента. - person Terance; 02.12.2015

Динамически дайте ему имя во время создания, а затем сделайте это.

    Component[] components = panel.getComponents();
    for (Component component: components) {
        var name = component.getName();  
        if(name != null){    
            if(name.equals("textfield 1")){
                var field = (JTextField)component;
                field.setText("whatever you want / same for options and other components")
            }
        }

    }
person Nico    schedule 05.01.2019

Ваша проблема заключается в написании утомительного текста кода. Почему бы просто не сгенерировать его и не вставить в программу!!...

for(int i=1 ; i<=maxpoints ;i++){
   System.out.println("JTextField tf"+i+" = new JTextField()"+";");
   System.out.println("points.add(tf"+i+")"+";");
}

Вставьте вывод приведенного выше кода в свою программу, и все готово. Теперь, чтобы получить доступ к содержимому текстовых полей, вы можете аналогичным образом сгенерировать утомительный текст кода....

for(int i=1 ; i<=maxpoints ;i++){
   System.out.println("String s"+i+" = JTextField tf"+i+".getText()"+";");
}
person Deepeshkumar    schedule 25.06.2017

person    schedule
comment
Можно ли получить этот компонент с его объявленным именем? Я имею в виду имя переменной компонента - person Terance; 02.12.2015