Компоненты Java get JPanel

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

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

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

TextField.getText();

спасибо

6 ответов


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

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

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 ... 

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

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

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


вы должны вызвать метод 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);
    }
}

    //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);
        }
    }

это то, что я сделал, чтобы рекурсивно пройти через контейнер и получить текстовые поля, которые находятся на 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());

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

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