【问题标题】:How to get text from same Text Field used multiple times in Java Swing如何从 Java Swing 中多次使用的同一文本字段中获取文本
【发布时间】:2021-02-20 01:59:12
【问题描述】:

我正在尝试从通过我的代码迭代的 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

});

现在好像什么都想不起来。

【问题讨论】:

  • 我看不出你的规范是如何工作的。如果您有多个字段,则一个“确定”按钮将不起作用。您需要一种方法来指定将返回 哪个 字段,或者(可能这个是正确的)您应该只返回 all 列表中的值。
  • 看起来您确实想使用 JTable,因为您正在以表格结构显示和检索数据。
  • @HovercraftFullOfEels 一个可编辑 JTable,对吧?

标签: java swing jtextfield


【解决方案1】:

在此代码中,当您在 addButton 中重新初始化 tftfv 时,您丢失了对先前定义的文本字段的引用

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() 将返回pJPanel)中的所有组件。

    为了区分每个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.
            }
        }
    });
    

    【讨论】:

    • 这很巧妙。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2017-12-01
    • 1970-01-01
    • 2021-10-06
    • 2012-07-21
    相关资源
    最近更新 更多