-1

プライベート文字列のユーザー名が null を返すのを助けてください!

さて、usernameID と呼ばれる JTextField と submit と呼ばれるボタンを含む JFrame ウィンドウを作成しました。submit がクリックされると、プライベート文字列 username を usernameID.getText() に等しく設定する setUsername() メソッドを呼び出す actionlistener が呼び出されます。設定されました。

したがって、私の getUsername() は変数ユーザー名を返しますが、それが返されると、返される値は null です。私には何か問題があると思います。setUsername メソッドでユーザー名の値を 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

そのコードの私の評価に基づいて (これは SSCCE ではなかったので、これは間違っている可能性があります)、JFrame実際にモーダルJDialogまたはJOptionPane.

それらは閉じられるまで「ブロック」されますが、その時点で値は であってはなりませんnull

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

うん。それについてはそれを封印します..

その他のヒント

  1. より良いヘルプが必要な場合は、SSCCEを投稿してください。
  2. 複数の JFrames の使用、良い/悪い習慣を参照してください。

固定 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 に答える
1

あなたはすべて正しい方法でやっています。問題は、ユーザー変数の値を呼び出そうとしているときです。

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

ボタンをクリックした後、挿入した値を最初に取得するため、 null が配信されます。

私はあなたのコードを試しましたが、変数は値を取得しています。

UI が別のスレッドにあることを知っておく必要があります。そのため、送信を待たずにコードで何かを試すと、null になります。

于 2013-07-10T11:00:37.620 に答える
1

コードをテストしたところ、正常に動作しました。入力した名前userでフィールドが適切に設定されます。

私が見ることができるいくつかの理由は、呼び出しgetUserName()が早すぎる (SUBMIT が押される前) か、GUI. 問題は明らかにコードの「他の部分」にあります

于 2013-07-10T10:58:47.293 に答える
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 に答える
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 に答える