Java 如何在此循环中刷新文本字段中的信息?

Java 如何在此循环中刷新文本字段中的信息?,java,swing,user-interface,authentication,Java,Swing,User Interface,Authentication,我正在尝试创建一个登录GUI,当输入正确的用户名和密码组合时,它将关闭。当我正确输入它们时,它工作正常,但是如果输入了错误的组合,循环只会以相同的“u”和“pw”值重复,阻止我输入任何其他内容 我尝试添加一个logB.setSelected(false)在while循环的末尾,但它仍然不允许我输入新值 (顺便说一句,我知道错误的密码标签从一开始就出现了,但我现在只是想解决这个问题。登录类也是以CLI开头的,所以代码中还有一些剩余部分,但我只是想在清理之前让它工作。) GUI类: import j

我正在尝试创建一个登录GUI,当输入正确的用户名和密码组合时,它将关闭。当我正确输入它们时,它工作正常,但是如果输入了错误的组合,循环只会以相同的“u”和“pw”值重复,阻止我输入任何其他内容

我尝试添加一个
logB.setSelected(false)在while循环的末尾,但它仍然不允许我输入新值

(顺便说一句,我知道错误的密码标签从一开始就出现了,但我现在只是想解决这个问题。登录类也是以CLI开头的,所以代码中还有一些剩余部分,但我只是想在清理之前让它工作。)

GUI类:

import javax.swing.*;
import java.awt.event.*;
import java.io.*;
public class Login_GUI implements ActionListener {


private static JLabel userL;
private static JTextField userT;
private static JLabel pwL;
private static JPasswordField pwT;
private static JLabel respL;
private static JFrame f; 
public static boolean authorized;
public static void GUIfunc(){
    JPanel p = new JPanel();
    f = new JFrame("RMT 1.0");
    f.setSize(250, 225);
    f.setLocation(1080,530);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
    f.add(p);

    userL = new JLabel("Username:");
    userL.setBounds(10,20,80,25);
    p.add(userL);
    userT = new JTextField(20);
    userT.setBounds(100,20,165,25);
    p.add(userT);

    pwL = new JLabel("Password:");
    pwL.setBounds(10,50,80,25);
    p.add(pwL);
    pwT = new JPasswordField(20);
    pwT.setBounds(100,50,165,25);
    p.add(pwT);

    JButton logB = new JButton("Login");
    logB.setBounds(10,80,80,25);
    logB.addActionListener(new Login_GUI());
    p.add(logB);

    respL = new JLabel("Incorrect username or password.");
    respL.setBounds(10,100,80,25);
    respL.setEnabled(false);
    p.add(respL);

}
@Override
    public void actionPerformed(ActionEvent e){
    while (authorized != true){
        String u = userT.getText();
        String pw = pwT.getText();
        try {
            authorized = Login2.loginfunc(u,pw);
        }
        catch(IOException exc){
            exc.printStackTrace();
        }
        logB.setSelected(false);

    }
    f.dispatchEvent(new WindowEvent(f, WindowEvent.WINDOW_CLOSING));

}
}
登录类别:

import java.util.*;
import java.io.*;
import java.nio.*;

class Login2{
public static boolean loginfunc(String u, String pw)throws IOException{
    File users = new File("C:\\Users\\Marcell\\OneDrive\\Computer Science\\IA\\users.txt");
    Scanner kb = new Scanner (System.in);
    Scanner sc = new Scanner (users);

    String token1 = "";
    int numOfEmp = 3;
    boolean authorized = false;
    boolean repeat = true;  
    String temp[] = new String[numOfEmp];

    for(int x=0;x<numOfEmp;x++){         
       token1 = sc.nextLine();
       temp[x] = token1;
    }


    String full = u + "," + pw;
    for (int x=0;x<numOfEmp;x++ ){
        String pass = temp[x];
        if (pass.equals(full)){
             System.out.println("Login successful.");
             authorized = true;
             repeat = false;
            }              
    }
    if (repeat = false){
        return(false);
    }

    return(authorized);
}
}
import java.util.*;
导入java.io.*;
导入java.nio.*;
类登录2{
公共静态布尔loginfunc(字符串u,字符串pw)引发IOException{
文件用户=新文件(“C:\\users\\Marcell\\OneDrive\\Computer Science\\IA\\users.txt”);
扫描仪kb=新扫描仪(System.in);
扫描仪sc=新扫描仪(用户);
字符串标记1=“”;
int numOfEmp=3;
布尔值=假;
布尔重复=真;
String temp[]=新字符串[numOfEmp];

对于(int x=0;x替换
actionPerformed
,如下所示:

public void actionPerformed(ActionEvent e){
    if (!authorized){
        String u = userT.getText();
        String pw = pwT.getText();
        try {
            authorized = Login2.loginfunc(u,pw);
            if(authorized) {
                f.dispatchEvent(new WindowEvent(f, WindowEvent.WINDOW_CLOSING));
            }
        }
        catch(IOException exc){
            exc.printStackTrace();
        }
        logB.setSelected(false);
    }       
}

将执行的操作替换为以下内容:

public void actionPerformed(ActionEvent e){
    if (!authorized){
        String u = userT.getText();
        String pw = pwT.getText();
        try {
            authorized = Login2.loginfunc(u,pw);
            if(authorized) {
                f.dispatchEvent(new WindowEvent(f, WindowEvent.WINDOW_CLOSING));
            }
        }
        catch(IOException exc){
            exc.printStackTrace();
        }
        logB.setSelected(false);
    }       
}

actionPerformed
方法不应该循环,而只是在用户名/密码不正确的情况下显示一条消息。每次按下登录按钮都会执行一次尝试。主Swing线程(EDT)中的无休止循环将导致Swing GUI冻结。请提供一个链接,以便我们更容易理解您需要什么,并提供一个适合您的解决方案。如果用户名/密码不正确,
actionPerformed
方法不应循环,而应仅显示一条消息。每次按下登录按钮都会执行一次尝试。结尾主回转螺纹中的s环(EDT)将导致Swing GUI冻结。请提供一个解决方案,以便我们能够更容易地了解您需要什么,并提供一个适合您情况的解决方案。感谢您的回答,但这只会使窗口关闭,即使输入了不正确的答案,因此如果我将while放在主循环中,该窗口将在每个月关闭并重新打开输入新值的时间。我刚刚更新了它。检查它是否满足您的要求。感谢您的回答,但这只是使窗口关闭,即使输入了错误的答案,因此如果我将while放入主循环中,每次输入新值时,窗口都会关闭并重新打开。我刚刚更新了它。检查它是否满足您的要求这是你的要求。