Как получить текст из одного и того же текстового поля, используемого несколько раз в Java Swing

#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. Это было гениально. Спасибо