Java 聊天应用程序的TextGUI.getText()返回null

Java 聊天应用程序的TextGUI.getText()返回null,java,swing,Java,Swing,原因之一是getText()返回null。例如: somebody:hi! 看来 null:hi! 我有一个按钮,您必须按下该按钮才能更改名称,但它仍然返回null,就好像JTextField中没有写入任何内容一样。如果我不按下该按钮,只需使用: username=getText(); 它似乎是: :hi! 这是我的代码(是的,我同意布局很糟糕,但目前我只是想让它工作): 你混淆了对象和变量,在错误的时间打了一个电话 在这里: 您在构造函数中而不是

原因之一是getText()返回null。例如:

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