为什么我的java变量返回空值

为什么我的java变量返回空值,java,swing,null,jframe,Java,Swing,Null,Jframe,帮助我的私有字符串用户名返回null 好的,我创建了一个JFrame窗口,其中包含一个名为usernameID的JTextField和一个名为submit的按钮,当单击submit时,将调用一个actionlistener,它调用方法setUsername(),该方法将私有字符串username设置为usernameID.getText(),一旦设置完毕 因此,我的getUsername()返回变量username,但当它返回时,返回的值为null,我认为有问题,我使用setUsername方法

帮助我的私有字符串用户名返回null

好的,我创建了一个JFrame窗口,其中包含一个名为usernameID的JTextField和一个名为submit的按钮,当单击submit时,将调用一个actionlistener,它调用方法setUsername(),该方法将私有字符串username设置为usernameID.getText(),一旦设置完毕

因此,我的getUsername()返回变量username,但当它返回时,返回的值为null,我认为有问题,我使用setUsername方法将username的值设置为usernameID.getText()

因此,请帮助我,我如何让名为getUsername的方法返回用户在usernameID中输入的内容

这是我的密码:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class GUI {
    private JFrame frame = new JFrame();
    private String user;

    GUI() {

        FlowLayout layout = new FlowLayout();
        JLabel usernameText = new JLabel("Username:");
        final JTextField usernameID = new JTextField(17);
        JButton submit = new JButton("Submit");

        frame.setTitle("Enter username");
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        frame.setSize(300, 100);
        frame.setAlwaysOnTop(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.requestFocus();
        frame.setLayout(layout);

        frame.add(usernameText);
        frame.add(usernameID);
        frame.add(submit);

        submit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                setUsername(usernameID.getText());

                frame.setVisible(false);
                frame.dispose();

            }

        });

    }

    private void setUsername(String text) {
        user = text;

    }

    String getUsername() {
        return user;
    }

}
这就是调用它的类

import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;

public class Play extends BasicGameState {

        public Play(int state) {
        }

        @Override
        public void init(GameContainer gc, StateBasedGame sbg)
                        throws SlickException {
                gc.setShowFPS(false);

                @SuppressWarnings("unused")
                Player player = new Player(getName(), 100, 100);
        }

        private String getName() {
                GUI gui = new GUI();
                System.out.println("Username: "+gui.getUsername());
                return gui.getUsername();
        }

        @Override
        public void render(GameContainer gc, StateBasedGame sbg, Graphics g)
                        throws SlickException {
        }

        @Override
        public void update(GameContainer gc, StateBasedGame sbg, int delta)
                        throws SlickException {
        }

        @Override
        public int getID() {
                // TODO Auto-generated method stub
                return 1;
        }
}

这是您应该做的:

submit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            setUsername(usernameID.getText());
            System.out.println(getUsername());

            frame.setVisible(false);
            frame.dispose();

        }

    });

}

测试了您的代码,运行良好。
user
字段get已正确设置为您刚才输入的名称


我可以看到的一些原因是,您调用
getUserName()
太早(在按下SUBMIT之前),或者在
GUI
的不同实例上。问题显然出在代码的“其他部分”中,或者使用以下方法可能会更好:

 submit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            setUsername(usernameID.getText());
           JOptionPane.showMessageDialog(null, getUsername());

            frame.setVisible(false);
            frame.dispose();

        }

    });

}

你做的每件事都是正确的,你的问题是当你试图调用你的用户变量的值时

     new GUI();
     System.out.println(user);
将传递null,因为它将在您单击按钮后首先获取您插入的值

我尝试了你的代码,变量得到了值


您必须知道您的UI位于另一个线程上,这就是为什么如果您在不等待提交的情况下尝试使用代码,那么在调用
getUserName
时,它将为null,否则它将返回
null
。因此,在get之前
setUserName

根据我对该代码的评估(该代码不是SSCCE,因此这可能是错误的),我可以猜到您正在使用
JFrame
,而实际上应该使用模态
JDialog
JOptionPane

它们将“阻塞”直到关闭,此时,值不应为
null

        private String getName() {
                GUI gui = new GUI();
                System.out.println("Username: "+gui.getUsername());
                return gui.getUsername();
        }
是的。那就对了

其他提示
  • 为了更快地获得更好的帮助,请发布一个
  • 固定SSCCE
    好吧,我改了

    public String getPlayerUsername() {
    
        String name;
    
        final JFrame frame = new JFrame();
        FlowLayout layout = new FlowLayout();
        final JLabel usernameText = new JLabel("Username:");
        final JTextField usernameID = new JTextField(17);
        JButton submit = new JButton("Submit");
    
        frame.setTitle("Enter username");
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        frame.setSize(300, 100);
        frame.setAlwaysOnTop(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.requestFocus();
        frame.setLayout(layout);
    
        frame.add(usernameText);
        frame.add(usernameID);
        frame.add(submit);
        submit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                frame.setVisible(false);
                frame.dispose();
    
                String name = usernameText.getText();
    
            }
    
        });
        return name;
    
    }
    

    我希望当它返回name时,它返回用户在usernameText中输入的值,它不起作用。

    在设置用户名后,您是否调用
    getUsername()
    ?String
    username
    在哪里?我只看到
    私有字符串用户在您的code@freak
    setUsername
    getUsername
    实际上在使用属性
    user
    。你能分享
    setUsername()
    getUsername()
    方法的代码吗?@freak Darn,对不起,我犯了一个错误,我的意思是说string user而不是string username,我修好了,我想OP已经这样做了?您的代码有什么变化,或者它将如何不返回
    null
    ?谢谢,我正在尝试将getUsername返回到另一个类,这是我的另一个类,名为Play:内部的getName方法返回GUI.getUsername,但由于某种原因它返回null。@Zeeshanjamal两个不同的答案?@user2568132和
    frame.setVisible(true)
    可能是GUI构造器中的最后一行代码错误,不是,脆弱,您没有阅读@Andrew Thompson的答案,那么为什么您在这里问这个问题
    public String getPlayerUsername() {
    
        String name;
    
        final JFrame frame = new JFrame();
        FlowLayout layout = new FlowLayout();
        final JLabel usernameText = new JLabel("Username:");
        final JTextField usernameID = new JTextField(17);
        JButton submit = new JButton("Submit");
    
        frame.setTitle("Enter username");
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        frame.setSize(300, 100);
        frame.setAlwaysOnTop(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.requestFocus();
        frame.setLayout(layout);
    
        frame.add(usernameText);
        frame.add(usernameID);
        frame.add(submit);
        submit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                frame.setVisible(false);
                frame.dispose();
    
                String name = usernameText.getText();
    
            }
    
        });
        return name;
    
    }