出于某种原因,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/

10-13 08:17