4

シリアル化によってユーザーを保存する単純なユーザー ログイン画面を作成しています。warningLabelGUI は問題なく、あとはシリアル化を実装するだけですが、ユーザーが間違ったパスワードまたはユーザー名を入力すると、テキストを正しく表示できません。最初のエラー メッセージが表示されますが、別のエラーが発生した場合、ラベルは同じままです。エラーが発生するたびにラベルを変更する必要があります。以下にコード全体を掲載します。

UserCreateAccountGUI クラス:

package userInfoAndSerialization;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;

public class UserCreateAccount implements ActionListener {

    public static int numOfUsers;

    String username;
    String password;

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        UserCreateAccount ucaGUI = new UserCreateAccount();
        ucaGUI.start();
    }

    JFrame frame;
    JPanel panel;
    JTextField usernameField;
    JPasswordField passwordField;
    JPasswordField confirmPasswordField;
    JLabel warningLabel;

    public void start() {
        frame = new JFrame("Create a new account");
        panel = new JPanel();

        panel.setLayout(new GridBagLayout());

        frame.getContentPane().add(BorderLayout.CENTER, panel);
        panel.setBackground(Color.ORANGE);

        JLabel userLabel = new JLabel("Username:");
        JLabel passwordLabel = new JLabel("Password:");
        JLabel confirmPasswordLabel = new JLabel("Confirm Password:");
        usernameField = new JTextField(15);
        passwordField = new JPasswordField(15);
        confirmPasswordField = new JPasswordField(15);

        GridBagConstraints right = new GridBagConstraints();
        right.anchor = GridBagConstraints.WEST;
        GridBagConstraints left = new GridBagConstraints();
        left.anchor = GridBagConstraints.EAST;

        right.weightx = (int) 2;
        right.fill = GridBagConstraints.REMAINDER;
        right.gridwidth = GridBagConstraints.REMAINDER;
        // actual GUI

        panel.add(userLabel, left);
        panel.add(usernameField, right);
        panel.add(passwordLabel, left);
        panel.add(passwordField, right);
        panel.add(confirmPasswordLabel, left);
        panel.add(confirmPasswordField, right);

        frame.setSize(300, 250);
        frame.setVisible(true);

        JButton createAccount = new JButton("Create this account");
        frame.getContentPane().add(BorderLayout.SOUTH, createAccount);
        createAccount.addActionListener(this);

        warningLabel = new JLabel();
        frame.getContentPane().add(BorderLayout.NORTH, warningLabel);
    }

    // this is where the problem is.
    public void actionPerformed(ActionEvent event) {
        if (!(passwordField.getPassword().toString().equals(confirmPasswordField.getPassword().toString()))) {
            warningLabel.setText("Your passwords do not match! Please try again!");
        } else if (passwordField.getPassword().toString().length() < 1 ) {
            warningLabel.setText("Your password is not long enough! Please try again!");
        } else if (usernameField.getText().length() < 1) {
            warningLabel.setText("Your username is not long enough! Please try again!");
        } else {
            warningLabel.setText("Account created successfully.");
        }
    }
}
4

1 に答える 1

2

これは飛ぶつもりはありません:

passwordField.getPassword().toString().
       equals(confirmPasswordField.getPassword().toString())

.toString()char 配列を呼び出した結果を出力して、私の言いたいことを正確に確認することをお勧めします。

たとえば、実行すると:

String fooString = "Foo";
char[] fooArray = fooString.toCharArray();
System.out.println(fooArray.toString());

あなたが期待しているように「Foo」を返すのではなくtoString()、char配列の典型的で期待される表現を返します[C@19821f。これを実行すると、ハッシュコード番号が私のものとは異なることに注意してください (これを 2 回実行しても同じです!)。

equals(...)2 つの char 配列を比較するには、Arrays クラス メソッドを使用することをお勧めします。つまり、

char[] pw1 = passwordField.getPassword();
char[] pw2 = confirmPasswordField.getPassword();
if (Arrays.equals(pw1, pw2)) {
   //...
}

注: を使用して char 配列を「実際の」文字列に変換するのは悪い解決策new String(myCharArray)ですが、パスワードが非常に脆弱で破られやすくなるため、これを行うことはお勧めしません。

于 2013-04-22T22:55:21.677 に答える