JTextField.getText() inside actionListener 无法 return 正确的字符串

JTextField.getText() inside of actionListener fails to return the proper String

我 运行 遇到调用 getText() 时无法从我的 JTextField 收集真实文本的问题。我提供了我 运行ning 的代码的简化版本,其中仅包括程序的各个方面,以重现问题。我试图在单击按钮 b 时从 JTextField 收集文本。

从 getText() 中 return 得到的正确值应该是曾经输入的值,但这里只是 return 一个空字符串。在测试中,我发现用字符串初始化 TJextField 无论如何都会 return 该字符串,即使它在按下按钮之前已更改。例如,如果在 init() 内部使用 setText(),它将继续 return 一个空字符串。

public class TopClass {
    public static void main(String[] args){
        BottomClass bottom = new BottomClass();
        bottom.init();
    }
}

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class BottomClass implements ActionListener{
    JFrame frame = new JFrame();
    JTextField tf = new JTextField();
    JButton b = new JButton("BUTTON");

    public void init(){
        BottomClass bc = new BottomClass();
        b.addActionListener((ActionListener) bc);

        frame.add(tf, BorderLayout.NORTH);
        frame.add(b, BorderLayout.SOUTH);
        frame.setSize(100,100);
        frame.show();
    }


    public void actionPerformed(ActionEvent e) {
        System.out.println("TEXT: "+tf.getText());
    }
}

这段代码中有几处根本不干净,所以我只是重写了大部分 BottomClass

  1. 你可以通过实现ActionListener来做到这一点,但是BottomClass不仅仅是一个EventListener,所以(以现实责任的名义)我只是添加了一个新实例ActionListener 到需要它的组件 (JButton)

  2. 您在方法 init() IN BottomClass 中创建了 BottomClass 的实例 bc。这根本没有意义,只是被删除了。

  3. 您在错误的位置初始化了您的组件。它们应该在构造函数中初始化,或者在您漂亮且合适的 init() 方法中初始化。我 99% 确定是您的初始化位置导致了您的麻烦。

  4. 我不确定这是多大的错误,但是在添加组件时您指定了 BorderLayout 约束,尽管从未将 BorderLayout 定义为要使用的 LayoutManager。我添加了 setLayout(new BorderLayout()) 调用。

  5. 拥有构造函数通常是一种很好的形式,尤其是当您有不同的 class 调用它时。即使它是空的,写成空的构造函数也比不可见的构造函数更容易阅读和理解。

综上所述,这是 BottomClass 的工作版本,TopClass 不需要任何调整:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class BottomClass
{
    JFrame frame;
    JTextField tf;
    JButton b;
    
    public BottomClass() 
    {
        // Empty constructor
    }
    
    public void init()
    {
        frame = new JFrame();
        frame.setLayout(new BorderLayout());
        
        tf = new JTextField();
        
        b = new JButton("Button");
        b.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                System.out.println("TEXT: " + tf.getText());
            }
        });
        
        frame.add(tf, BorderLayout.NORTH);
        frame.add(b, BorderLayout.SOUTH);
        frame.setSize(100, 100);
        frame.setVisible(true);
    }
}