2014-11-13 5 views
1

Я пытаюсь создать программу, в которой пользователю нужна учетная запись для доступа к другим ее частям. Я хочу, чтобы это было настроено так, чтобы, если пароль подтверждения пользователя 2 не совпадает, они должны повторно ввести информацию. Кроме того, если пользователь оставляет что-либо пустое, они должны повторно ввести всю информацию. Как я могу это сделать, чтобы он продолжал цикл до тех пор, пока пользователь не попадет в хорошую информацию?Продолжение цикла до хорошего ввода?

if (e.getSource() == okButton) { 
     if(!passString.equals(passStringConfirm) || userName.equals(null) || passString.equals(null) || passStringConfirm.equals(null)){ 
       enterUsername.setText(""); 
       enterPassword.setText(""); 
       enterConfirmPassword.setText(""); 
       } 
      } 

Это то, что у меня есть до сих пор, и работает только на одну итерацию. Я пытался сделать это, и он постоянно распечатывал предупреждающее сообщение, которое я пытался распечатать на JOptionPane.

import java.awt.Color; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPasswordField; 
import javax.swing.JTextField; 
import javax.swing.border.Border; 

public class CreateAccount extends JFrame implements ActionListener { 

    JLabel username = new JLabel("Enter your username"); 
    JTextField enterUsername = new JTextField(null, 15); 
    JLabel password = new JLabel("Enter your password"); 
    JPasswordField enterPassword = new JPasswordField(null, 15); 
    JLabel passwordConfirm = new JLabel("Confirm your password."); 
    JPasswordField enterConfirmPassword = new JPasswordField(null, 15); 
    JButton okButton = new JButton("OK"); 

    String userName; 
    double initialDeposit; 

    public CreateAccount() { 

     add(username); 
     add(enterUsername); 
     add(password); 
     add(enterPassword); 
     add(passwordConfirm); 
     add(enterConfirmPassword); 
     add(okButton); 

     okButton.addActionListener(this); 

     setTitle("New Bank Account Creation"); 
     setVisible(true); 
     setLocationRelativeTo(null); 
     setSize(270, 300); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLayout(new FlowLayout()); 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     char[] pass = enterPassword.getPassword(); 
     String passString = new String(pass); 
     char[] passConfirm = enterConfirmPassword.getPassword(); 
     String passStringConfirm = new String(passConfirm); 

     userName = enterUsername.getText(); 

     if (e.getSource() == okButton) { 
      if(userName == null || userName.isEmpty() || passString == null || passString.isEmpty() || !passString.equals(passStringConfirm)) { 
        enterUsername.setText(""); 
        enterPassword.setText(""); 
        enterConfirmPassword.setText(""); 
        Border redLine = BorderFactory.createLineBorder(Color.red); 
        enterUsername.setBorder(redLine); 
        enterPassword.setBorder(redLine); 
        enterConfirmPassword.setBorder(redLine); 
        repaint(); 
        } 
       } 
      super.dispose(); 

      int response = 0; 
      String firstDesposit = JOptionPane.showInputDialog("Welcome " + userName + ". Enter your initial deposit."); 
      initialDeposit = Double.parseDouble(firstDesposit); 
      if (response == JOptionPane.OK_OPTION) { 
       new Menu(); 
      } 
     } 
    } 
+5

Нажми кнопку? Это блокирует пользовательский интерфейс. Также ** ничего ** '.equals (null)', если это 'null', вы получите' NullPointerException', когда вы вызываете метод 'equals'. –

+1

где есть петля? – redFIVE

+0

Цикл - это то, что мне нужно для реализации. Я попытался сделать это, пока сообщение JOptionPane сообщило об ошибке пользователя, но оно будет постоянно печататься, когда я закрываю окно. Как я могу сделать эту функцию цикла только при однократной печати предупреждения JOptionPane? – AlecR

ответ

0

Неверный результат теста if. Если у вас есть String (s) null, вы получите NullPointerException. Я думаю, вы хотели

if (userName == null || userName.isEmpty() || passString == null 
      || passString.isEmpty() 
      || !passString.equals(passStringConfirm)) { 
    enterUsername.setText(""); 
    enterPassword.setText(""); 
    enterConfirmPassword.setText(""); 
} 

Тогда ваш код пользовательского интерфейса должен проверить, пусты ли они, прежде чем разрешить пользователю действовать. Наконец, в приведенном выше коде я считаю, что вы можете использовать setBorder(), чтобы дать этим полям красную границу.

if (userName == null || userName.isEmpty() || passString == null 
      || passString.isEmpty() 
      || !passString.equals(passStringConfirm)) { 
    Border redLine = BorderFactory.createLineBorder(Color.red); 
    enterUsername.setText(""); 
    enterPassword.setText(""); 
    enterConfirmPassword.setText(""); 
    enterUsername.setBorder(redLine); 
    enterPassword.setBorder(redLine); 
    enterConfirmPassword.setBorder(redLine); 
} 

Редактировать

на основе кода вы предоставили, но вам нужно это в другом месте!

if(userName == null || userName.isEmpty() || passString == null 
     || passString.isEmpty() || !passString.equals(passStringConfirm)) { 
    enterUsername.setText(""); 
    enterPassword.setText(""); 
    enterConfirmPassword.setText(""); 
    Border redLine = BorderFactory.createLineBorder(Color.red); 
    enterUsername.setBorder(redLine); 
    enterPassword.setBorder(redLine); 
    enterConfirmPassword.setBorder(redLine); 
    repaint(); 
} else { // <-- add this 
    super.dispose(); 
    int response = 0; 
    String firstDesposit = JOptionPane.showInputDialog(
      "Welcome " + userName + ". Enter your initial deposit."); 
    initialDeposit = Double.parseDouble(firstDesposit); 
    if (response == JOptionPane.OK_OPTION) { 
     new Menu(); 
    } 
} 
+0

Как я могу избежать блокировки кадра? – AlecR

+0

Я понял, что цикл while заставляет его замерзнуть. как я могу сделать это, чтобы окно снова появилось без блокировки? – AlecR

+0

@AlecR Вы не можете сделать это с помощью цикла. Вы должны внедрить метод в пользовательском интерфейсе (который вы еще не отправили) для проверки пароля, прежде чем разрешить перемещение экрана входа в систему. Все, что вы разместили, - это обработчик обратного вызова для нажатия кнопки и циклирования на событии с нажатием кнопки * будет * блокировать пользовательский интерфейс. –

-1

Предполагая, что e.getSource() является блокирующим вызовом.

while(true){ 
if (e.getSource() == okButton) { 
     if(!passString.equals(passStringConfirm) || userName.equals(null) || passString.equals(null) || passStringConfirm.equals(null)){ 
       enterUsername.setText(""); 
       enterPassword.setText(""); 
       enterConfirmPassword.setText(""); 
       } 
      } 
else 
    break; //correct password 

}