如何实现用户可以在 Java Swing 中的另一个窗口中更改的密码

问题描述 投票:0回答:1

我正在设计的程序允许用户仅在将当前管理员密码输入到下面的 setupModeLock 类中的密码字段后才能更改管理员密码。但是,密码永远不会保存到 setupModeLock 变量 pWord

import javax.swing.*;
import java.awt.event.*;
public class setupModeLock {
    private static int pWord;
    public final JFrame miniScreen;
    setupModeLock() {
        miniScreen = new JFrame("Setup Mode");
        final JLabel info = new JLabel("Please enter an admin password");
        final JPasswordField adminField = new JPasswordField();
        final JLabel result = new JLabel("");
        info.setBounds(120, 300, 200, 30);
        adminField.setBounds(120, 325, 200, 30);
        result.setBounds(200, 325, 400, 30);
        miniScreen.add(info);
        miniScreen.add(adminField);
        miniScreen.add(result);
        adminField.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent code) {
                String password = new String(adminField.getPassword());
                try {
                    int val = Integer.parseInt(password);
                    if(val == pWord) 
                    {       
                        miniScreen.dispose();
                        new setUpMode()
                    }
                    else
                    {
                        adminField.setText("");
                        result.setText("Incorrect Password");
                    }
                } catch (Exception e) {
                    adminField.setText("");
                    result.setText("Invalid Password");
                }
            }
        });
        miniScreen.setSize(780,700);
        miniScreen.setVisible(true);
        miniScreen.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
    public static void changePassword(int newPass)
    {
        pWord = newPass;
    }
    public static int getPword()
    {
        return pWord;
    }
}

接下来的课实际上显示的是更改密码的按钮

import javax.swing.*;
import java.awt.event.*;
public class setUpMode extends setupModeLock{
    public JFrame window;
    setUpMode() {
        super();
        miniScreen.dispose();
        window = new JFrame();
        window.setAlwaysOnTop(true);
        JButton modPassword = new JButton("Change Admin Password");
        modPassword.setBounds(1000, 800, 300, 30);
        window.add(modPassword);
        modPassword.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent c) {
                new PasswordChanger();
            } 
        });
    }
}

在类PasswordChanger中,用户向PasswordField输入密码,然后在setUpModeLock中使用继承的方法changePassword更改密码

import javax.swing.*;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class PasswordChanger extends setupModeLock implements ActionListener {
    JPasswordField thisField;
    JLabel success;
    Container container;
    CardLayout cardlayout;

    PasswordChanger() {
        super();
        miniScreen.dispose();
        JFrame newPlace = new JFrame("Change Password");
        container = newPlace.getContentPane();
        cardlayout = new CardLayout();
        container.setLayout(cardlayout);
        success = new JLabel("");
        thisField = new JPasswordField();
        thisField.addActionListener(this);
        container.add("a", thisField);
        container.add("b", success);
        newPlace.setSize(300,100);
        newPlace.setVisible(true);
        newPlace.setLocationRelativeTo(null);
        newPlace.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
    public void actionPerformed(ActionEvent bro) {
        val = new String(thisField.getPassword());
        try
        {
            int pCode = Integer.parseInt(val);
            changePassword(pCode);
            success.setText("Password successfuly save. Exit now");
        } catch(Exception e) {
            success.setText("Faulty Password type. Exit and try again");
        }
        cardlayout.next(container);
    }
}

但是运行后,setupMode中连更改密码JButton都没有出现。

我尝试继承多个类,但我的密码始终保持为 0。我可以做什么来修改 setUpModeLock 中的密码,以便任何对 changePassword() 的调用都会使新密码在所有子类中成为常量。

java swing inheritance frontend passwords
1个回答
0
投票

如果您利用现有的方法,例如,您可以使用更少的代码行。 JOptionPane。这是一个仍然需要填写一些位的示例。它定义了一个面板,其中包含读取数据所需的输入元素和 getter。然后有一个方法

changePassword()
向用户显示面板并评估数据。

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.TextField;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class ChangePassword extends JPanel {
    
    private JTextField username;
    private JPasswordField oldPassword;
    private JPasswordField newPassword1;
    private JPasswordField newPassword2;
    
    public ChangePassword() {
        setLayout(new GridBagLayout());
        add(new JLabel("Username"), new GridBagConstraints(0,0, 1, 1, 0,0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,0,0,0), 0,0));
        username = new JTextField(30);
        add(username, new GridBagConstraints(1,0, 1, 1, 0,0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,0), 0,0));
        add(new JLabel("Old Password"), new GridBagConstraints(0,1, 1, 1, 0,0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,0,0,0), 0,0));
        oldPassword = new JPasswordField();
        add(oldPassword, new GridBagConstraints(1,1, 1, 1, 0,0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,0), 0,0));
        add(new JLabel("New Password"), new GridBagConstraints(0,2, 1, 1, 0,0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,0,0,0), 0,0));
        newPassword1 = new JPasswordField();
        add(newPassword1, new GridBagConstraints(1,2, 1, 1, 0,0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,0), 0,0));
        add(new JLabel("Repeat Password"), new GridBagConstraints(0,3, 1, 1, 0,0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0,0,0,0), 0,0));
        newPassword2 = new JPasswordField();
        add(newPassword2, new GridBagConstraints(1,3, 1, 1, 0,0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,0), 0,0));
    }
    
    public String getUsername() {
        return username.getText();
    }
    
    public char[] getOldPassword() {
        return oldPassword.getPassword();
    }
    
    public char[] getNewPassword1() {
        return newPassword1.getPassword();
    }
    
    public char[] getNewPassword2() {
        return newPassword2.getPassword();
    }
    
    public static void changePassword() {
        ChangePassword cp = new ChangePassword();
        if (JOptionPane.showOptionDialog(
                null, cp, "Authentication required", 
                JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, 
                null, null, null) == JOptionPane.OK_OPTION) {
            // check if username and old password are correct
            String username = cp.getUsername();
            char[] oldPassword = cp.getOldPassword();
            
            // check if newPassword1 and newPassword2 are the same
            char[] newPassword1 = cp.getNewPassword1();
            char[] newPassword2 = cp.getNewPassword2();
            
            // change password
            
            JOptionPane.showMessageDialog(null, "Password changed");
        } else {
            JOptionPane.showMessageDialog(null, "Cancelled by user");
        }
    }

    public static void main(String[] args) {
        changePassword();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.