Вы не можете «добавить цикл for i int i к имени переменной», если только вы не хотите использовать отражения (https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/package-summary.html). Отражения позволят вам искать в java- Object
его поля и на основе их имя (если оно открыто), доступ к ним.
К счастью, это не то, что вам действительно нужно здесь. Вы на самом деле ищете способ идентифицировать дочерние элементы (Component
s) вашей J? Panel как по типу, так и по имени, а затем получить индекс, который вы ранее добавили. Я предлагаю сделать следующее:
// This pattern can be anywhere in the Class-file:
public static final Pattern POSTFIX_PATTERN = Pattern.compile("tFrame(\\d+)");
// This should be in your exposed GUI class (supposedly the Panel), but can be anywhere it can access headerPanel.
public List<JTextField> findTextFields() {
List<JTextField> fields = new LinkedList<>();
Component[] children = headerPanel.getComponents();
// this is your 'search-loop':
for (Component child : children) {
if (child instanceof JTextField) {
JTextField childField = (JTextField) child;
String name = childField.getName();
if (name.startsWith("tFrame")) {
fields.add(childField);
}
}
}
return fields;
}
(Это также можно сделать как с Stream
, но приведенный выше код проще).
Приведенный выше код «находит» ваши существующие компоненты, и вы можете оттуда работать, например, сортируя их по их именам, а затем печатая.
Проблема, по которой вы получаете только часть ваших текстовых полей, кажется, реагирует на изменения, потому что вы (вероятно) не передаете один и тот же массив inputData
различным созданным вами DocumentListener
. если вы установите точку останова и проверьте, я уверен, что у inputData-Arrays другой хэш. Тем не менее, я не могу вывести эти 100%, так как окружающий код неполон.
Я бы предложил изменить:
if (tField.getText() != null) {
Object[] currentData = new Object[getFieldNum + 1];
currentData[getFieldNum] = tField.getText();
inputData[getFieldNum] = tField.getText();
for (int i = 0; i < inputData.length; i++) {
if (inputData[i] != null) {
System.out.println("for i = " + i + ": " + inputData[i]);
}
}
}
до
for (JTextField textField : findTextFields()) {
String name = textField.getName();
Matcher matcher = POSTFIX_PATTERN.matcher(name);
if (matcher.matches()) {
String strPostfix = matcher.group(1);
int postfixNumeric = Integer.parseInt(strPostfix);
System.out.println("for postfix = " + postfixNumeric + ": " + textField.getText());
}
}
Таким образом, вы получаете компоненты в тот момент, когда пользователь фактически внес изменение, на которое вы хотите отреагировать.
Также на заметке:
Вы действительно хотите заменить все существующие текстовые поля и их текущее состояние после уменьшения или увеличения числа на JSpinner?
Может быть, стоит удалить элементы, которые равны postfixNumeric >= getTextFields().size()
, или увеличить количество элементов, не удаляя те, которые меньше, чем предыдущее число на JSpinner. Это можно сделать с помощью петли, которую вы получили.
Редактировать
Проблема, как оказалось, возникла из множества полей экземпляров, используемых вместо локальных переменных. Поскольку код был опубликован лишь частично, это было трудно или невозможно определить только из одного вопроса.