如何从Java Swing中多次使用的同一文本字段中获取文本

问题描述

我正在尝试从通过代码迭代的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,但是getText()方法似乎不起作用。>

okButton.addActionListener( e -> {
    
        String txt = tfv.getText(); //only captures the text from the last field in the panel

});

现在似乎什么也没想。

enter image description here

解决方法

方法getComponents()将返回pJPanel)中的所有组件。

为了区分每个JTextField,您可以通过方法setName()给每个人一个唯一的名称(并通过方法getName()来检索名称)或使用方法{ {3}}(并通过方法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.
        }
    }
});
,

在此代码中,当您重新初始化<input type="email" value="abcdef"/><br> <input type="email" value="[email protected]"/><br> <input type="email" value=""/><br> <input type="email" value="someone@somesite"/>中的tftfv时,您失去了对先前定义的文本文件的引用

addButton

因此,要解决此问题,您需要定义一个ArrayList来保存对所有已定义文本字段的引用,然后才能访问所有它们:

tf = new JTextField("Name",20);
tfv = new JTextField("Value",7);

访问

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);
    }
});