Java 聊天应用程序的TextGUI.getText()返回null
原因之一是getText()返回null。例如:Java 聊天应用程序的TextGUI.getText()返回null,java,swing,Java,Swing,原因之一是getText()返回null。例如: somebody:hi! 看来 null:hi! 我有一个按钮,您必须按下该按钮才能更改名称,但它仍然返回null,就好像JTextField中没有写入任何内容一样。如果我不按下该按钮,只需使用: username=getText(); 它似乎是: :hi! 这是我的代码(是的,我同意布局很糟糕,但目前我只是想让它工作): 你混淆了对象和变量,在错误的时间打了一个电话 在这里: 您在构造函数中而不是
somebody:hi!
看来
null:hi!
我有一个按钮,您必须按下该按钮才能更改名称,但它仍然返回null,就好像JTextField中没有写入任何内容一样。如果我不按下该按钮,只需使用:
username=getText();
它似乎是:
:hi!
这是我的代码(是的,我同意布局很糟糕,但目前我只是想让它工作):
你混淆了对象和变量,在错误的时间打了一个电话 在这里: 您在构造函数中而不是在ActionListener中调用getText(),这意味着您是在textf JTextField在GUI中呈现之前以及在用户有机会填充它之前调用的 在这里:
@Override
public void actionPerformed(ActionEvent ev)
{
user=textname.getText();
}
您在ActionListener中更改了user字段的状态,但不幸的是,在我显示的第一个代码中使用了user varable,同样是在呈现该字段之前以及在用户与该字段交互之前
我建议您在ActionListener代码中添加更多的代码,包括使用用户变量的代码,以便该变量实际包含相关信息
其他建议:
- 所有字段都不应声明为静态。如果您觉得它们必须是静态的才能修复错误,那么您就是在反向修复错误。正确的解决方法是创建不需要静态字段的代码(当然有一些例外,但在当前情况下不适用)
下面是代码的简化版本,向您展示我的意思:
import javax.swing.*;
import java.awt.event.*;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class TextClient extends JFrame {
public JPanel mypanel = new JPanel();
public JButton send = new JButton("Send");
public JButton changename = new JButton("Change name");
public JTextField textf = new JTextField(10);
public JTextField textname = new JTextField(10);
public JLabel username = new JLabel("Name:");
public String user;
public TextClient() throws IOException {
add(mypanel);
mypanel.add(textf);
mypanel.add(send);
mypanel.add(username);
mypanel.add(textname);
mypanel.add(changename);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
pack();
setVisible(true);
setLocationRelativeTo(null);
changename.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ev) {
user = textname.getText();
System.out.println("user in action listener: " + user);
}
});
// you're trying to use user here!
System.out.println("user outside of action "
+ "listener where you try to use it: " + user); // !!
send.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ev) {
String sendit = textf.getText();
System.out.println("sendit: " + sendit);
}
});
}
public static void main(String[] args) {
try {
new TextClient();
} catch (IOException ex) {
Logger.getLogger(TextClient.class.getName()).log(Level.SEVERE, null,
ex);
}
}
}
@如果它是JTextField的方法,它不是由我创建的。textf引用的是正在发送的消息,而不是用户名(用户名仅在ActionListener中使用getText()。我不太理解您在第一个代码中使用变量,然后在action listener中使用变量的意思。@DianaLc:我知道textf指的是什么。我仍然坚持我的调查结果和建议。底线是,您试图在程序的用户有机会设置或更改用户字段之前使用该字段,因此它当然为空。@DianaLc:请参阅我的答案编辑中的简化版代码,以说明我的意思。谢谢,现在,我理解并修改了代码,使其达到了预期的输出效果,并且工作正常。我非常感谢您的工作。
@Override
public void actionPerformed(ActionEvent ev)
{
user=textname.getText();
}
import javax.swing.*;
import java.awt.event.*;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class TextClient extends JFrame {
public JPanel mypanel = new JPanel();
public JButton send = new JButton("Send");
public JButton changename = new JButton("Change name");
public JTextField textf = new JTextField(10);
public JTextField textname = new JTextField(10);
public JLabel username = new JLabel("Name:");
public String user;
public TextClient() throws IOException {
add(mypanel);
mypanel.add(textf);
mypanel.add(send);
mypanel.add(username);
mypanel.add(textname);
mypanel.add(changename);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
pack();
setVisible(true);
setLocationRelativeTo(null);
changename.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ev) {
user = textname.getText();
System.out.println("user in action listener: " + user);
}
});
// you're trying to use user here!
System.out.println("user outside of action "
+ "listener where you try to use it: " + user); // !!
send.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ev) {
String sendit = textf.getText();
System.out.println("sendit: " + sendit);
}
});
}
public static void main(String[] args) {
try {
new TextClient();
} catch (IOException ex) {
Logger.getLogger(TextClient.class.getName()).log(Level.SEVERE, null,
ex);
}
}
}