Java получает компоненты JPanel
У меня есть JPanel, полный JTextFields...
for (int i=0; i<maxPoints; i++) {
JTextField textField = new JTextField();
points.add(textField);
}
Как мне потом получить JTextFields в этом JPanel? Например, если я хочу их значения с помощью
TextField.getText();
Спасибо
Ответы
Ответ 1
Хорошо имейте в виду, что они не попали туда сами (я думаю, прочитал некоторые вопросы о динамическом создании этих панелей во время выполнения)
В ответах, размещенных там, кто-то сказал, что вы должны ссылаться на эти текстовые поля в массиве. Вот что вам нужно здесь:
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 ...
Ответ 2
Каждый JPanel в Java также является контейнером AWT. Таким образом, вы должны иметь возможность использовать getComponents для получения массива содержащихся в нем компонентов на панели, перебора по ним, проверки их типов (чтобы убедиться, что вы не получили другие элементы управления) и делать все, что вам нужно.
Однако это, как правило, плохой дизайн. Если вы знаете, что вам нужно получить доступ к определенным компонентам, лучше сохранить массив этих текстовых полей и передать их, даже если они визуально содержатся в контейнере.
Если это повторяющаяся задача или может быть выполнена из нескольких точек, может даже иметь смысл иметь специальный класс, представляющий панель с текстовыми полями, которая затем будет предоставлять через свои средства интерфейса доступ к этим полям.
Ответ 3
Вы должны вызвать метод 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);
}
}
Ответ 4
//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);
}
}
Ответ 5
Это то, что я сделал, чтобы рекурсивно пройти через контейнер и получить текстовые поля, которые находятся на 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());
Ответ 6
Ваша проблема заключается в написании утомительного текста кода. Почему бы просто не создать его и вставить в программу!...
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()"+";");
}