Java получает компоненты JPanel
-
21-08-2019 - |
Вопрос
У меня есть JPanel, полный JTextFields...
for (int i=0; i<maxPoints; i++) {
JTextField textField = new JTextField();
points.add(textField);
}
Как мне позже получить JTextFields в этой JPanel?Например, если я хочу, чтобы их значения были
TextField.getText();
Спасибо
Решение
Имейте в виду, что они не достигли этого сами (я думаю, что можно прочитать несколько вопросов о динамическом создании этих панелей во время выполнения).
В опубликованных там ответах кто-то сказал, что вам следует сохранять ссылку на эти текстовые поля в массиве.Это именно то, что вам здесь нужно:
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);
}
}
Это то, что я сделал, чтобы рекурсивно пройтись по контейнеру и получить текстовые поля, находящиеся в 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());
//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);
}
}
Динамически дайте ему имя во время создания, а затем сделайте это.
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")
}
}
}
Ваша проблема — написание утомительного текста кода.Почему бы просто не сгенерировать его и не вставить в программу!!...
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()"+";");
}