如何从用作提示的 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 次,则关闭主框架。
这里是业余 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 次,则关闭主框架。