为什么我的java变量返回空值
帮助我的私有字符串用户名返回null 好的,我创建了一个JFrame窗口,其中包含一个名为usernameID的JTextField和一个名为submit的按钮,当单击submit时,将调用一个actionlistener,它调用方法setUsername(),该方法将私有字符串username设置为usernameID.getText(),一旦设置完毕 因此,我的getUsername()返回变量username,但当它返回时,返回的值为null,我认为有问题,我使用setUsername方法将username的值设置为usernameID.getText() 因此,请帮助我,我如何让名为getUsername的方法返回用户在usernameID中输入的内容 这是我的密码:为什么我的java变量返回空值,java,swing,null,jframe,Java,Swing,Null,Jframe,帮助我的私有字符串用户名返回null 好的,我创建了一个JFrame窗口,其中包含一个名为usernameID的JTextField和一个名为submit的按钮,当单击submit时,将调用一个actionlistener,它调用方法setUsername(),该方法将私有字符串username设置为usernameID.getText(),一旦设置完毕 因此,我的getUsername()返回变量username,但当它返回时,返回的值为null,我认为有问题,我使用setUsername方法
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();
}
是的。那就对了
其他提示
好吧,我改了
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()
?Stringusername
在哪里?我只看到私有字符串用户代码>在您的code@freaksetUsername
和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;
}