为什么我的java变量返回null

时间:2013-07-10 10:48:06

标签: java swing null jframe

帮助我的私有字符串用户名返回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;
        }
}

7 个答案:

答案 0 :(得分:1)

测试了您的代码并且运行正常。使用您刚输入的名称正确设置user字段。

我可以看到的一些原因是您要么过早地调用getUserName()(在按下SUBMIT之前),要么在GUI的另一个实例上调用{{1}}。问题肯定存在于代码的“其他部分”

答案 1 :(得分:1)

您正在以正确的方式做所有事情,当您尝试调用用户变量的值时,问题就在于此。

     new GUI();
     System.out.println(user);

将传递null,因为它会在您单击按钮后首先获得您插入的值。

我尝试了你的代码,变量正在获取值。

你必须知道你的UI在另一个线程上,这就是为什么如果你在没有等待提交的情况下尝试使用代码,它将为null

答案 2 :(得分:1)

基于我对该代码的评估(这不是SSCCE,因此这可能是错误的),我猜你在实际使用模态JFrame时正在使用JDialogJOptionPane

他们将“阻止”直到关闭,此时,该值不应为null

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

是的。关于密封它..

其他提示

  1. 为了更好地提供帮助,请发布SSCCE
  2. 请参阅The Use of Multiple JFrames, Good/Bad Practice?
  3. 修正了SSCCE

    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中输入的值,它不起作用。