帮助我的私有字符串用户名返回null!
好的,我创建了一个JFrame窗口,其中包含一个名为usernameID的JTextField和一个名为submit的按钮,当单击submit时会调用一个actionlistener调用一个setUsername()方法,该方法将private string username设置为等于usernameID.getText( ),一旦确定。
所以,我的getUsername()返回变量username,但是当它返回时,返回的值为null,对我来说我认为有问题,我将username的值设置为usernameID.getText()with我的setUsername方法。
那么请大家帮帮忙,我怎样才能让名为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;
}
}
答案 0 :(得分:1)
测试了您的代码并且运行正常。使用您刚输入的名称正确设置user
字段。
我可以看到的一些原因是您要么过早地调用getUserName()
(在按下SUBMIT之前),要么在GUI
的另一个实例上调用{{1}}。问题肯定存在于代码的“其他部分”
答案 1 :(得分:1)
您正在以正确的方式做所有事情,当您尝试调用用户变量的值时,问题就在于此。
new GUI();
System.out.println(user);
将传递null,因为它会在您单击按钮后首先获得您插入的值。
我尝试了你的代码,变量正在获取值。
你必须知道你的UI在另一个线程上,这就是为什么如果你在没有等待提交的情况下尝试使用代码,它将为null
答案 2 :(得分:1)
基于我对该代码的评估(这不是SSCCE,因此这可能是错误的),我猜你在实际使用模态JFrame
时正在使用JDialog
或JOptionPane
。
他们将“阻止”直到关闭,此时,该值不应为null
。
private String getName() {
GUI gui = new GUI();
System.out.println("Username: "+gui.getUsername());
return gui.getUsername();
}
是的。关于密封它..
import java.awt.FlowLayout;
import java.awt.event.*;
import javax.swing.*;
public class GUI {
// add 'true' to ensure this is a blocking dialog.
private JDialog frame = new JDialog((JFrame)null, true);
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.setLocationRelativeTo(null);
frame.setSize(300, 100);
frame.setAlwaysOnTop(true);
// Not allowed in a dialog..
//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();
}
});
// as mentioned in a comment by mKorbel, this needs to be last
frame.setVisible(true);
}
private void setUsername(String text) {
user = text;
}
String getUsername() {
return user;
}
public static void main(String[] args) {
GUI gui = new GUI();
System.out.println("Username: "+gui.getUsername());
}
}
答案 3 :(得分:0)
这是你应该做的:
submit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setUsername(usernameID.getText());
System.out.println(getUsername());
frame.setVisible(false);
frame.dispose();
}
});
}
答案 4 :(得分:0)
或者用它可能会更好:
submit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setUsername(usernameID.getText());
JOptionPane.showMessageDialog(null, getUsername());
frame.setVisible(false);
frame.dispose();
}
});
}
答案 5 :(得分:0)
当你拨打getUserName
时,应该有一个已设置的用户名,否则它将返回null
。在获得之前setUserName
。
答案 6 :(得分:0)
好的,我改变了它。
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中输入的值,它不起作用。