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
。
你可以通过实现ActionListener
来做到这一点,但是BottomClass
不仅仅是一个EventListener,所以(以现实责任的名义)我只是添加了一个新实例ActionListener
到需要它的组件 (JButton
)
您在方法 init()
IN BottomClass
中创建了 BottomClass
的实例 bc
。这根本没有意义,只是被删除了。
您在错误的位置初始化了您的组件。它们应该在构造函数中初始化,或者在您漂亮且合适的 init()
方法中初始化。我 99% 确定是您的初始化位置导致了您的麻烦。
我不确定这是多大的错误,但是在添加组件时您指定了 BorderLayout
约束,尽管从未将 BorderLayout
定义为要使用的 LayoutManager。我添加了 setLayout(new BorderLayout())
调用。
拥有构造函数通常是一种很好的形式,尤其是当您有不同的 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);
}
}
我 运行 遇到调用 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
。
你可以通过实现
ActionListener
来做到这一点,但是BottomClass
不仅仅是一个EventListener,所以(以现实责任的名义)我只是添加了一个新实例ActionListener
到需要它的组件 (JButton
)您在方法
init()
INBottomClass
中创建了BottomClass
的实例bc
。这根本没有意义,只是被删除了。您在错误的位置初始化了您的组件。它们应该在构造函数中初始化,或者在您漂亮且合适的
init()
方法中初始化。我 99% 确定是您的初始化位置导致了您的麻烦。我不确定这是多大的错误,但是在添加组件时您指定了
BorderLayout
约束,尽管从未将BorderLayout
定义为要使用的 LayoutManager。我添加了setLayout(new BorderLayout())
调用。拥有构造函数通常是一种很好的形式,尤其是当您有不同的 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);
}
}