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