Java получить компоненты JPanel - PullRequest
15 голосов
/ 16 декабря 2008

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

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

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

TextField.getText();

Спасибо

Ответы [ 7 ]

12 голосов
/ 16 декабря 2008

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

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

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 ... 
10 голосов
/ 16 декабря 2008

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

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

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

3 голосов
/ 20 ноября 2015

Вы должны вызвать метод 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);
    }
}
2 голосов
/ 13 апреля 2013
    //una forma de recorer todos los elementos dentro de un jpanel
    Component[] components = jPanelX.getComponents();

    for (int i = 0; i < components.length; i++) {

        if(components[i].getClass().getName().toString().equals("javax.swing.JTextField")){
            components[i].setEnabled(false);
        }
    }
1 голос
/ 05 января 2019

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

    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")
            }
        }

    }
1 голос
/ 11 октября 2017

Это то, что я сделал, чтобы рекурсивно пройти через контейнер и получить текстовые поля на 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());
0 голосов
/ 25 июня 2017

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

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()"+";");
}
...