用于聊天的 TextGUI application.getText() returns null
TextGUI for chat application.getText() returns null
出于一个原因 getText() returns null.For 示例:
somebody:hi!
显示为
null:hi!
我有一个按钮,您必须按下它才能更改名称,但它仍然 returns 空,好像 JTextField.If 中什么也没有写,我没有按下按钮,只是使用:
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 中更改了用户字段的状态,但不幸的是,您在我展示的第一个代码中使用了用户变量,再次 before在用户与其交互之前渲染。
我建议你把更多的代码,包括使用用户变量的代码放在你的ActionListener代码中,这样该变量实际上包含相关信息。
其他推荐:
- None 的字段应声明为静态。如果您认为它们必须是静态的才能修复错误,那么您就是在向后修复错误。正确的解决方法是创建不需要静态字段的代码(当然有一些例外,但 none 适用于您当前的情况)。
这是您的代码的简化版本,向您展示我的意思:
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);
}
}
}
出于一个原因 getText() returns null.For 示例:
somebody:hi!
显示为
null:hi!
我有一个按钮,您必须按下它才能更改名称,但它仍然 returns 空,好像 JTextField.If 中什么也没有写,我没有按下按钮,只是使用:
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 中更改了用户字段的状态,但不幸的是,您在我展示的第一个代码中使用了用户变量,再次 before在用户与其交互之前渲染。
我建议你把更多的代码,包括使用用户变量的代码放在你的ActionListener代码中,这样该变量实际上包含相关信息。
其他推荐:
- None 的字段应声明为静态。如果您认为它们必须是静态的才能修复错误,那么您就是在向后修复错误。正确的解决方法是创建不需要静态字段的代码(当然有一些例外,但 none 适用于您当前的情况)。
这是您的代码的简化版本,向您展示我的意思:
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);
}
}
}