Java ActionPerformed函数工作,但公共静态void main中的if语句不工作

Java ActionPerformed函数工作,但公共静态void main中的if语句不工作,java,Java,我可以让它在同一个文件中工作,但我不习惯在不同的文件中使用多个类。为了缩短代码,我省略了导入 代码如下: Main.java: public class Main { public static void main(String[] args) { handler handler = new handler(); Login Login = new Login(); List<String> users =

我可以让它在同一个文件中工作,但我不习惯在不同的文件中使用多个类。为了缩短代码,我省略了导入

代码如下:

Main.java:

public class Main {

    public static void main(String[] args) {
    
        handler handler = new handler();
        Login Login = new Login();
    
        List<String> users = new ArrayList<>();
        List<String> passwords = new ArrayList<>();
    
        users.add("123");
        passwords.add("123");
    
        if (handler.buttonPress) {
            String userInput = Login.userText.getText();
            String passwordInput = String.valueOf(Login.passwordText.getPassword());
                    
            if (users.contains(userInput)) {
            
                int userNo = users.indexOf(userInput);
                String password = passwords.get(userNo);
            
                if (passwordInput.equals(password)) {
                    Login.outcomeLabel.setText("Login Successfull!");
                } 
                else {
                    Login.outcomeLabel.setText("Username or Password not recognised");
                }
            }
            else {
                Login.outcomeLabel.setText("Username or Password not recognised");
            }
        }
    }
}
handler.java:

public class handler implements ActionListener {

    Login Login = new Login();

    boolean buttonPress;
    public void actionPerformed(ActionEvent loginButton) {
        buttonPress = true;
    }
}

因此,操作侦听器正在将布尔值设置为true,但if语句未识别它。

此代码存在问题:

  • 由于循环引用导致递归,您会得到一个StackOverflower错误:您的登录类创建一个新的处理程序实例,而处理程序创建一个新的登录实例,这将永远重复(或者直到堆栈内存用完)
  • 您试图在用户有机会更改之前提取并使用一个值,这里是buttonPress布尔值。这是因为JFrame不是模式窗口,因此不会像模式对话框那样停止程序流,因此您可以显示JFrame,然后在用户有机会与GUI交互之前立即尝试使用buttonPress字段
  • 将线性静态主要方法范式编程与事件驱动的Swing GUI编程混为一谈的方式很糟糕。最好坚持其中一个
  • 还存在其他不太重要的问题,包括不遵循Java约定的类名(处理程序应该是“处理程序”),以及使用空布局,这使得GUI很难维护,并且在所有平台上都不好看
  • 相反:

    • 创建密钥类的单个实例并在需要时传递它们,而不是在不同的类中创建多个实例
    e、 g

    • 如果需要模态窗口,请显示模态对话框,如模态JDialog
    • 坚持使用线性非GUI编程范式或事件驱动GUI范式,以避免大量头痛问题和不协调的代码。更好的做法是,将程序逻辑与视图(用户交互)分开,以便相同的逻辑/数据部分可以在事件驱动GUI或非事件驱动线性程序中使用
    • 学习并遵循Java命名约定,包括给以大写字母开头的类命名和以小写字母开头的字段命名。这将使您的代码更容易让其他人理解

    此代码的问题:

  • 由于循环引用导致递归,您会得到一个StackOverflower错误:您的登录类创建一个新的处理程序实例,而处理程序创建一个新的登录实例,这将永远重复(或者直到堆栈内存用完)
  • 您试图在用户有机会更改之前提取并使用一个值,这里是buttonPress布尔值。这是因为JFrame不是模式窗口,因此不会像模式对话框那样停止程序流,因此您可以显示JFrame,然后在用户有机会与GUI交互之前立即尝试使用buttonPress字段
  • 将线性静态主要方法范式编程与事件驱动的Swing GUI编程混为一谈的方式很糟糕。最好坚持其中一个
  • 还存在其他不太重要的问题,包括不遵循Java约定的类名(处理程序应该是“处理程序”),以及使用空布局,这使得GUI很难维护,并且在所有平台上都不好看
  • 相反:

    • 创建密钥类的单个实例并在需要时传递它们,而不是在不同的类中创建多个实例
    e、 g

    • 如果需要模态窗口,请显示模态对话框,如模态JDialog
    • 坚持使用线性非GUI编程范式或事件驱动GUI范式,以避免大量头痛问题和不协调的代码。更好的做法是,将程序逻辑与视图(用户交互)分开,以便相同的逻辑/数据部分可以在事件驱动GUI或非事件驱动线性程序中使用
    • 学习并遵循Java命名约定,包括给以大写字母开头的类命名和以小写字母开头的字段命名。这将使您的代码更容易让其他人理解

    为什么不将逻辑移到
    actionPerformed
    方法中呢?这里有很多严重的问题,但主要的问题是:JFrames不是模态的,你在用户有机会更改它之前检查程序状态,其次,你在创建多个类实例,而不是检查重要类的状态,因此,如果您需要一个Swing GUI窗口来进行模式化操作,在处理之前阻止程序流,那么创建并显示一个模型JDialog,而不是JFrame。接下来,只为上面的每个关键类创建一个实例,而不是创建多个实例,并将这些实例作为参数传递到所需的位置。我如何传递实例?上面的代码也会导致StackOverflower错误为什么不在
    actionPerformed
    方法中移动逻辑?这里有一系列严重问题,但主要问题是:JFrames不是模态的,在用户有机会更改程序状态之前检查程序状态,其次,创建多个类实例,而不检查重要类的状态,即与用户相关的类。因此,如果需要Swing GUI窗口进行模式操作,在处理之前阻止程序流,然后创建并显示模型JDialog,而不是JFrame。接下来,只为上面的每个关键类创建一个实例,而不是创建多个实例,并将这些实例作为参数传递到需要它们的位置。我该如何传递实例?上面的代码也会导致StackOverflower错误
    public class handler implements ActionListener {
    
        Login Login = new Login();
    
        boolean buttonPress;
        public void actionPerformed(ActionEvent loginButton) {
            buttonPress = true;
        }
    }
    
    class Login {
        // Main main = new Main();   // serves no purpose
        // handler handler = new handler();  // a circular reference
        handler handler;
        
        //
        
        public void setHandler(handler handler) {
            this.handler = handler;
        }