出于某种原因,getText()返回null。例如:
somebody:hi!
显示为
null:hi!
我有一个按钮,您必须按一下按钮才能更改名称,但是它仍然返回null,就像在JTextField中什么都没有写一样。如果我不放按钮,只需使用:
username=getText();
它显示为:
:hi!
这是我的代码(是的,我同意布局很糟糕,但是目前我正试图使其工作):
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
public class TextClient extends JFrame{
public JPanel mypanel=new JPanel(new GridBagLayout());
public static JButton send=new JButton("Send");
public static JButton changename=new JButton("Change name");
public static JTextField textf=new JTextField(10);
public static JTextField textname=new JTextField(10);
public static JLabel username=new JLabel("Name:");
public static JTextArea texta=new JTextArea(20,20);
public static JScrollPane jsp=new JScrollPane(texta);
public String user;
public TextClient() throws IOException
{
add(mypanel);
GridBagConstraints c1=new GridBagConstraints();
c1.anchor=GridBagConstraints.SOUTH;
c1.gridx=3;
c1.gridy=1;
mypanel.add(textf,c1);
GridBagConstraints c2=new GridBagConstraints();
c2.gridx=2;
c2.gridy=2;
mypanel.add(jsp,c2);
GridBagConstraints c3=new GridBagConstraints();
c3.gridx=2;
c3.gridy=0;
mypanel.add(send,c3);
GridBagConstraints c4=new GridBagConstraints();
c4.gridx=0;
c4.gridy=0;
mypanel.add(username,c4);
GridBagConstraints c5=new GridBagConstraints();
c5.gridx=1;
c5.gridy=0;
mypanel.add(textname,c5);
GridBagConstraints c6=new GridBagConstraints();
c6.gridx=2;
c6.gridy=1;
mypanel.add(changename,c6);
setVisible(true);
setSize(500,500);
setLocationRelativeTo(null);
setResizable(false);
Socket socket=new Socket("localhost",9000);
changename.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ev)
{
user=textname.getText();
}
});
ClientPeer cp=new ClientPeer(user,socket);
String message=textf.getText();
cp.start();
send.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ev)
{
try {
String sendit=textf.getText();
cp.sendMessage(sendit);
textf.setText("");
} catch (IOException ex) {
Logger.getLogger(TextClient.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
public static void main(String [] args)
{
try {
new TextClient();
} catch (IOException ex) {
Logger.getLogger(TextClient.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
最佳答案
您混合了对象和变量,并在错误的时间进行了一次调用。
这里:
ClientPeer cp=new ClientPeer(user,socket);
String message=textf.getText();
您可以在构造函数中而不是在ActionListener中调用getText(),这意味着您要在textf JTextField甚至已经在GUI中呈现之前以及用户有机会填充它之前进行此调用。
这里:
@Override
public void actionPerformed(ActionEvent ev)
{
user=textname.getText();
}
您可以在ActionListener中更改用户字段的状态,但是不幸的是,在呈现字段之前以及用户与之交互之前,我在所示的第一个代码中使用了用户变量。
我建议您将更多代码放入其中,包括在ActionListener代码中使用user变量的代码,以使该变量实际包含相关信息。
其他建议:
您的所有字段均不得声明为静态。如果您认为它们必须是静态的才能更正错误,则可以向后修正错误。正确的解决方法是创建不需要静态字段的代码(当然有一些例外,但在当前情况下不适用)。
这是您的代码的简化版本,以向您展示我的意思:
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);
}
}
}
关于java - 聊天应用程序的TextGUI.getText()返回null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28283604/