#java #swing #jtextfield
#java #swing #jtextfield
Вопрос:
Я пытаюсь получить текст из JTextField, который повторяется в моем коде (по-видимому, я не могу добавить другое текстовое поле из кнопки). Вот что делает кнопка «Добавить элементы»:
addButton.addActionListener(new ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
tf = new JTextField("Name",20);
tfv = new JTextField("Value", 7);
p.revalidate();
p.repaint();
p.add(tf);
p.add(tfv);
}
});
Он добавляет два новых текстовых поля на панель с помощью FlowLayout.
Теперь я хочу получить текст, заданный пользователем, из текстовых полей, каждое из которых присвоено другой переменной или, возможно, в ArrayList, нажав кнопку «OK», но метод getText(), похоже, не работает.
okButton.addActionListener( e -> {
String txt = tfv.getText(); //only captures the text from the last field in the panel
});
Кажется, сейчас ничего не могу придумать.
Комментарии:
1. Я не понимаю, как может работать ваша спецификация. Если у вас есть несколько полей, одна кнопка «ОК» не будет работать. Вам нужен способ указать, какое поле будет возвращено, или (возможно, это правильно), вы должны просто вернуть все значения в списке.
2. Похоже, вы действительно хотите использовать JTable, поскольку вы отображаете и извлекаете данные в табличной структуре.
3.@HovercraftFullOfEels редактируемый
JTable
, верно?
Ответ №1:
в этом коде при повторной инициализации tf
и tfv
в addButton
вы потеряли ссылку на предыдущие определенные текстовые поля
tf = new JTextField("Name",20);
tfv = new JTextField("Value", 7);
итак, чтобы решить эту проблему, вам нужно определить ArrayList для хранения ссылок на все определенные текстовые поля, а затем вы можете получить доступ ко всем из них:
ArrayList<JTextField> arrayNames = new ArrayList<JTextField>();
ArrayList<JTextField> arrayValues = new ArrayList<JTextField>();
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
tf = new JTextField("Name",20);
tfv = new JTextField("Value", 7);
p.revalidate();
p.repaint();
p.add(tf);
p.add(tfv);
arrayNames.add(tf);
arrayValues.add(tfv);
}
});
доступ
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (JTextField txtValue : arrayValues) {
System.out.println(txtValue.getText());
}
}
});
Ответ №2:
Метод getComponents() вернет все компоненты в p
(the JPanel
).
Чтобы различать каждое JTextField
из них, вы можете либо присвоить каждому уникальное имя с помощью метода setName() (и получить имя с помощью метода getName()
), либо установить некоторое свойство с помощью метода putClientProperty() (и получить свойство с помощью метода getClientProperty()
).
Например, с помощью setName()
установки уникального имени для каждого JTextField
.
private int counter = 0; // class member
addButton.addActionListener(new ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
tf = new JTextField("Name",20);
tf.setName("tf" counter);
tfv = new JTextField("Value", 7);
tfv.setName("tfv" counter);
counter ;
p.revalidate();
p.repaint();
p.add(tf);
p.add(tfv);
}
});
Как идентифицировать каждый JTextField
:
okButton.addActionListener( e -> {
Component[] cmpts = p.getComponents();
for (Component cmpt : cmpts) {
String name = cmpt.getName();
if (name.matches("^tf\d $") {
// Code to handle it.
}
else if (name.matches("^tfv\d $") {
// Handling code.
}
}
});
Комментарии:
1. Это было гениально. Спасибо