-1

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

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

所以,我的 getUsername() 返回变量 username,但是当它返回时,返回的值为 null,对我来说我认为有问题,我使用 setUsername 方法将 usernameID.getText() 的值设置为 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;
        }
}
4

7 回答 7

1

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

我可以看到的一些原因是您要么调用getUserName()得太早(在按下 SUBMIT 之前)要么在GUI. 问题肯定出在代码的“其他部分”中

于 2013-07-10T10:58:47.293 回答
1

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

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

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

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

您必须知道您的 UI 在另一个线程上,这就是为什么如果您在不等待提交的情况下尝试使用代码进行某些操作,它将为空

于 2013-07-10T11:00:37.620 回答
1

根据我对该代码的评估(这不是 SSCCE,因此这可能是错误的),我可以猜测您在JFrame实际应该使用 modalJDialogJOptionPane.

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

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

是的。那关于密封它..

其他提示

  1. 为了尽快获得更好的帮助,请发布SSCCE
  2. 请参阅使用多个 JFrame,好/坏做法?

固定 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());
    }

}
于 2013-07-10T11:26:57.910 回答
0

在您调用的那一刻getUserName应该有一个已经设置的用户名,否则它将返回null。所以setUserName在得到之前。

于 2013-07-10T11:16:16.950 回答
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;

}

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

于 2013-07-11T08:05:43.887 回答
0

这是你应该做的:

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

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

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

        }

    });

}
于 2013-07-10T10:55:56.870 回答
0

或者这样做可能会更好:

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

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

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

        }

    });

}
于 2013-07-10T11:00:08.760 回答