【问题标题】:JTextField.getText() inside of actionListener fails to return the proper StringactionListener 内部的 JTextField.getText() 无法返回正确的字符串
【发布时间】:2020-11-20 23:20:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: java swing actionlistener jtextfield


    【解决方案1】:

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

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

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

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

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

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

    说了这么多,这是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);
        }
    }
    

    【讨论】:

    • 感谢您清理它。我认为“BottomClass bc”用于先前版本中的分离方法actionListener。不知道为什么会在那里,但它确实有效。
    猜你喜欢
    • 2014-02-14
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2014-05-28
    • 2014-06-14
    • 2017-08-22
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多