如何从用作提示的 JOptionPane return 到主 JFrame window?

How to return to the main JFrame window from a JOptionPane used as a prompt?

这里是业余 Java 程序员。这是我仍在处理的代码。我的计划是使用 JOptionPane 来显示输入的密码是否正确以及剩余的尝试次数。我的问题是,如果输入正确的密码,剩下的尝试不会改变,循环会一直继续下去,而不是我计划终止的计划。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Password extends JFrame {
private static final int WIDTH = 300;
private static final int HEIGHT = 165;
private static final int tries = 3;

private JLabel passwordLabel;
private JTextField passwordTF;

private JButton okB , cancelB;

private OkButtonHandler obHandler;
private CancelButtonHandler cbHandler;

public Password () {
    passwordLabel = new JLabel ("Input password: " , SwingConstants.LEFT);

    passwordTF = new JTextField (25);

    okB = new JButton ("OK");
    obHandler = new OkButtonHandler();
    okB.addActionListener(obHandler);

    cancelB = new JButton("Cancel");
    cbHandler = new CancelButtonHandler();
    cancelB.addActionListener(cbHandler);

    Container pane = getContentPane();
    pane.setLayout(null);

    pane.add(passwordLabel);
    pane.add(passwordTF);
    pane.add(okB);
    pane.add(cancelB);

    passwordLabel.setBounds(100 , 0 , 100 , 50);
    passwordTF.setBounds(5 , 40 , 275 , 30);
    okB.setBounds(35 , 75 , 100 , 40);
    cancelB.setBounds(150 , 75 , 100 , 40);

    setTitle("Password");
    setSize(WIDTH , HEIGHT);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
}
private class OkButtonHandler implements ActionListener {
    public void actionPerformed (ActionEvent e) {
        String prompt = passwordTF.getText();

        for (int x = 1 ; x<=3 ; x++) {
            if (x==1) {
                if (prompt.equals("Computer")) {
                    passwordTF.setText("");
                    JOptionPane.showMessageDialog(null , "Access granted" , "Password" , JOptionPane.INFORMATION_MESSAGE);
                    break;
                }
                else {
                    passwordTF.setText("");
                    JOptionPane.showMessageDialog(null , "Access denied: "+(tries-1) , "Password" , JOptionPane.WARNING_MESSAGE);
                    continue;
                }
            }
            else if (x==2) {
                if (prompt.equals("Computer")) {
                    passwordTF.setText("");
                    JOptionPane.showMessageDialog(null , "Access granted" , "Password" , JOptionPane.INFORMATION_MESSAGE);
                    break;
                }
                else {
                    passwordTF.setText("");
                    JOptionPane.showMessageDialog(null , "Access denied: "+(tries-2) , "Password" , JOptionPane.WARNING_MESSAGE);
                    continue;
                }
            }
            else if (x==3) {
                if (prompt.equals("Computer")) {
                    passwordTF.setText("");
                    JOptionPane.showMessageDialog(null , "Access granted" , "Password" , JOptionPane.INFORMATION_MESSAGE);
                    break;
                }
                else {
                    passwordTF.setText("");
                    JOptionPane.showMessageDialog(null , "Access denied: System blocked" , "Password" , JOptionPane.WARNING_MESSAGE);
                    continue;
                }
            }
        }
    }
}
private class CancelButtonHandler implements  ActionListener {
    public void actionPerformed (ActionEvent e) {
        System.exit(0);
    }
}
public static void main (String[] args) {
    Password password = new Password ();
}       

}

在这方面不需要使用for循环,使用

continue;

它将继续执行 for 循环并依次打印每个错误消息。

每次按下 OK 按钮时都会调用 actionListener,请尝试如下操作:

private class OkButtonHandler implements ActionListener {
public void actionPerformed (ActionEvent e) {
    String prompt = passwordTF.getText();
            if (prompt.equals("Computer")) {
                passwordTF.setText("");
                JOptionPane.showMessageDialog(null , "Access granted" , "Password" , JOptionPane.INFORMATION_MESSAGE);
            }
            else {
                tries--;
                if (tries != 0){
                passwordTF.setText("");
                JOptionPane.showMessageDialog(null , "Access denied: "+(tries) , "Password" , JOptionPane.WARNING_MESSAGE);
                }
                 else {
                     passwordTF.setText("");
                     JOptionPane.showMessageDialog(null , "Access denied: System blocked" , "Password" , JOptionPane.WARNING_MESSAGE);
                     System.exit(0);
                 }
            }
        }
}

这也将执行您需要的所有操作,然后如果您输入错误密码 3 次,则关闭主框架。