变量不会从JTextField获取数据

时间:2013-12-15 17:50:04

标签: java swing jframe jtextfield

我对编码很新,我正在努力通过首先检查索引文件是否存在(其中有密码)来获取便宜且简单的登录代码,如果是,请阅读它所说的内容和询问用户的用户名和密码。如果文件不存在或为空,则应提示用户从那时起使用两个字段并将其写入索引文件。

然而,我遇到的问题是,我设置的用于运行代码以将这两个字段写入文件的按钮似乎没有在字符串中找到任何内容,因此无法写入任何内容。我在下面添加了代码,如果有任何遗忘,我可以添加更多代码。

以下是GUI窗口和动作侦听器的代码。

public class GUIComponents extends JFrame{
public static String UserN = " ";
public static String PassW = " ";

public static void LoginScreen(){
    JFrame LoginFrame = new JFrame("Log in Menu");
    JPanel LoginInfo = new JPanel();
    JPanel LoginAttempt = new JPanel();

    JButton LoginOkay = new JButton("Log in");
    LoginListenerClass loginListen = new LoginListenerClass();
    LoginOkay.addActionListener(loginListen);
    JButton LoginCancel = new JButton("Cancel");
    CancelListenerClass cancelListen = new CancelListenerClass();
    LoginCancel.addActionListener(cancelListen);
    JLabel usern = new JLabel("Username:");
    JLabel passw = new JLabel("Password:");
    JTextField user = new JTextField(15);
    JTextField pass = new JTextField(15);
    LayoutManager LoginLayout = new GridLayout(2,2,5,10);
    LayoutManager OkayCancel = new FlowLayout();
    LoginInfo.setLayout(LoginLayout);
    LoginAttempt.setLayout(OkayCancel);

    LoginInfo.add(usern);
    LoginInfo.add(user);
    LoginInfo.add(passw);
    LoginInfo.add(pass);
    LoginAttempt.add(LoginOkay);
    LoginAttempt.add(LoginCancel);

    if(Login.firstTimeCheck()==true){
        JOptionPane.showMessageDialog(null, "This is your first time using this program. \nPlease enter the Username"
                + " and Password\n              you wish to set for all users.");
    }
    LoginFrame.add(LoginInfo, BorderLayout.CENTER);
    LoginFrame.add(LoginAttempt, BorderLayout.SOUTH);

    LoginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    LoginFrame.setLocationRelativeTo(null);                         




    LoginFrame.pack();
    LoginFrame.setVisible(true);

    UserN = user.getText();
    PassW = pass.getText();
}

}

class LoginListenerClass implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        if(Login.firstTimeCheck()==false){
            Login.passCheck();
        }
        else{
            try {
                Login.CreateLogin(GUIComponents.UserN,     GUIComponents.PassW);
                System.out.println(GUIComponents.UserN+" "+ GUIComponents.PassW);
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    }
}

class CancelListenerClass implements ActionListener{
        @Override
    public void actionPerformed(ActionEvent e){
        System.exit(0);
    }
}

下面是登录功能的代码:

public class Login {
private static String UserName;     //true username
private static String Password;     //true password
private static boolean accepted = false;
private static String user="";
private static String pass="";
private static boolean firstTime = true;

Login(){

}

public static void CreateLogin(String user, String pass) throws IOException{
    UserName = user;
    Password = pass;

    try{
        FileWriter FW = new FileWriter("Index.txt");
        PrintWriter output = new PrintWriter(FW);
        output.println(UserName);
        output.println(Password);
        output.close();
        FW.close();
    }
    catch(IOException e){
        e.printStackTrace();
    }
}

public static void LogIn(){
    try{
        FileReader FR = new FileReader("Index.txt");
        firstTime = false;
        Scanner sc = new Scanner(FR);
        user = sc.nextLine();
        pass = sc.nextLine();
        if(user.equalsIgnoreCase("")){
            firstTime = true;
        }
        if(pass.equals("")){
            firstTime = true;
        }
    }

    catch(FileNotFoundException e){
        firstTime = true;
    }

    GUIComponents.LoginScreen();





}

public static void passCheck(){
    if(UserName.equalsIgnoreCase(user)){
        if(Password.equals(pass)){
            accepted = true;
        }
    }
    else{
        JOptionPane.showMessageDialog(null,"Your Username and Password do not /n match our files."
                + "Please try again.");
    }
}

public static boolean firstTimeCheck(){
    return firstTime;
}

}

如果有人能弄清楚我在这种情况下做了什么愚蠢的事,请告诉我。如果代码很长且令人恼火,我会道歉。

3 个答案:

答案 0 :(得分:2)

在您的代码中:

public static void LoginScreen(){
    // ............ code deleted to simplify things

    JTextField user = new JTextField(15);
    JTextField pass = new JTextField(15);

    // ..... code removed to simplify things

    LoginFrame.pack();
    LoginFrame.setVisible(true);

    UserN = user.getText();
    PassW = pass.getText();
}

您尝试在创建GUI时从JTextField中提取文本,然后用户有机会在其中输入任何内容。要解决这个问题,请不要在GUI创建时提取文本,而是要在JButton的ActionListener中按下JButton时激活的事件,或者在输入时激活的JTextFields的ActionListener。在文本字段具有焦点时按下。


顺便说一下,你的代码遭受了大量过度使用静态修饰符的困扰,并建议你想要学习如何在尝试创建Swing GUI之前创建真正的OOP类和Java基础。你不会后悔这样做。

答案 1 :(得分:2)

在侦听器类actionPerformed方法中读取User和PassWORD值。否则,您正在初始化时读取值为空字符串。

答案 2 :(得分:2)

您定义的变量

public static String UserN = " ";
public static String PassW = " ";

不会从文本字段中获取最新值。

建议的解决方案(不是理想的,但对于您的代码而言)

  1. 使Jtext字段静态公开,如GuiComponents class

    public static JTextField user;    
    public static JTextField pass;
    
  2. LoginListener

    Login.CreateLogin(GUIComponents.user.getText(),GUIComponents.pass.getText());
    System.out.println(GUIComponents.user.getText() + GUIComponents.pass.getText());