java:验证GUI中的所有文本字段都已完成

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6400431/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-16 05:36:52  来源:igfitidea点击:

java: validating that all text fields in GUI are completed

javaswinguser-interfacetextfield

提问by trs

I am trying to create a GUI that allows someone to set up an account. I would like to validate that all the text fields are complete when the create account button is pressed. What is the best way to do this? I am attaching my code but my validation that the text fields are complete is not working.

我正在尝试创建一个允许某人设置帐户的 GUI。我想在按下创建帐户按钮时验证所有文本字段是否完整。做这个的最好方式是什么?我正在附上我的代码,但我对文本字段是否完整的验证不起作用。

see code below:

见下面的代码:

public class GUIaccounts extends JFrame{

private JLabel name;
private JLabel initDeposit;
private JLabel chooseAccount;
private JLabel empty;
private JTextField nameTextField;
private JTextField initDepositTextField;
private JPanel dataPanel;
private JPanel accountTypePanel;
private JRadioButton savingsAccount;
private JRadioButton premiereChecking;
private ButtonGroup radioButtonGroup;
private JButton createAccountButton;
private JPanel createAccountPanel;
private Bank myBank;



public GUIaccounts(){
    setTitle("Create an Account");
    setSize(1000,1000);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    buildPanels();
    setVisible(true);
    pack();
    setLocationRelativeTo(null);
     myBank=new Bank();

}

private void buildPanels(){
    //create the panels
    dataPanel= new JPanel();
    dataPanel.setLayout(new GridLayout(2,2));
    accountTypePanel=new JPanel();
    accountTypePanel.setLayout(new GridLayout(3,1));
    createAccountPanel=new JPanel();
    createAccountPanel.setLayout(new FlowLayout());
    //create labels
    name=new JLabel("Enter Name:");
    Border border = LineBorder.createBlackLineBorder();
    name.setBorder(border);
    initDeposit=new JLabel("Enter Initial Deposit:");
    initDeposit.setBorder(border);
    chooseAccount=new JLabel("Choose Account:");
    empty=new JLabel(" ");
    //create text fields
    nameTextField=new JTextField();
    initDepositTextField=new JTextField();
    //create buttons
    savingsAccount = new JRadioButton("Savings Account");
    premiereChecking =new JRadioButton ("Premiere Checking Account");
    createAccountButton=new JButton("Create Account");
    //add labels and field to the panel
    dataPanel.add(name);
    dataPanel.add(nameTextField);
    dataPanel.add(initDeposit);
    dataPanel.add(initDepositTextField);
    //add button to the panel
    accountTypePanel.add(chooseAccount);
    accountTypePanel.add(empty);
    accountTypePanel.add(savingsAccount);
    accountTypePanel.add(premiereChecking);
    createAccountPanel.add(createAccountButton);

    //add actionListeners to the buttons
    savingsAccount.addActionListener(new RadioButtonListener());
    premiereChecking.addActionListener(new RadioButtonListener());
    createAccountButton.addActionListener(new createAccountListener());
    //add focus to the text field
    nameTextField.addFocusListener(new nameFieldListener());
    initDepositTextField.addFocusListener(new initDepositFieldListener());
    //add panels to the contentPane
    add(dataPanel, BorderLayout.NORTH);
    add(accountTypePanel, BorderLayout.CENTER);
    add(createAccountPanel, BorderLayout.SOUTH);
    //group radio buttons
    radioButtonGroup= new ButtonGroup();
    radioButtonGroup.add(savingsAccount);
    radioButtonGroup.add(premiereChecking);
}
    private class createAccountListener implements ActionListener{
        public void actionPerformed(ActionEvent e){
            String name=null;
            Double amount=null;
            if (savingsAccount.isSelected()){
                name=nameTextField.getText();
                amount=Double.valueOf(initDepositTextField.getText());
                if(name!=null && amount !=null){
                try{

                    SavingsAccount account=new SavingsAccount(name,AccountIDs.getNextID(), amount);
                    myBank.addAccount(account);
                    JOptionPane.showMessageDialog(null,"Account setup was successful" + myBank.toString());
                }



                catch(Exception e1){
                    JOptionPane.showMessageDialog(null,"Unable to set up account. " +e1.getMessage());
                }
            }
                else{
                    JOptionPane.showMessageDialog(null, "All fields must be completed in order to set up account");
                }
            }

            else if(premiereChecking.isSelected()){
                name=nameTextField.getText();
                amount=Double.valueOf(initDepositTextField.getText());
                if(name!=null && amount!=null){
                try{
                    PremiereCheckingAccount account=new PremiereCheckingAccount(name, AccountIDs.getNextID(),amount);
                    myBank.addAccount(account);
                    JOptionPane.showMessageDialog(null,"Account setup was successful" +myBank.toString());
                }
                catch(Exception e1){
                    JOptionPane.showMessageDialog(null,"Unable to set up account. " + e1.getMessage());
                }
                }
                else{
                    JOptionPane.showMessageDialog(null, "All fields must be completed in order to set up account");
                }

            }
            else{
                JOptionPane.showMessageDialog(null,"Please select the type of account you want to create.");
            }
        }
    }
    private class RadioButtonListener implements ActionListener{
        public void actionPerformed(ActionEvent e){


        }
    }

    private class nameFieldListener implements FocusListener{
        public void focusGained(FocusEvent e){

            nameTextField.selectAll();//highlight contents
        }

        public void focusLost(FocusEvent e){
    }



}
    private class initDepositFieldListener implements FocusListener{
        public void focusGained(FocusEvent e){
            initDepositTextField.selectAll();
        }

        public void focusLost(FocusEvent e) {


        }
    }



    public static void main(String[]args){
    GUIaccounts myAccount=new GUIaccounts();
    }   

}

}

采纳答案by camickr

The getText() method will not return null. It will return the empty String ("").

getText() 方法不会返回 null。它将返回空字符串 ("")。

Your test should be something like:

你的测试应该是这样的:

if ( textField.getText().trim().length() == 0 )
  // error

回答by blah blah

Old question, but it's generally a good idea to create a "validation" helper method that does all the validation first, then if it checks out you can load all the values into whatever you're doing (variables, class attributes to instantiate something, etc).

老问题,但创建一个“验证”辅助方法通常是一个好主意,它首先执行所有验证,然后如果它检查出来,您可以将所有值加载到您正在执行的任何操作中(变量、类属性以实例化某些东西,等等)。

eg:

例如:

private class createAccountListener implements ActionListener
{
  public void actionPerformed(ActionEvent ae)
  {
    // first we validate all fields... if they pass, we do
    // the rest of the code, otherwise we let the failed validation
    // code tell user what happened, and skip the rest of the code
    if ( validateFields() )
    {
      String fname = fieldFirstName.getText();
      String lname = fieldFirstName.getText();
      int    age   = fieldAge.getText();
    }
  }
}

// test all text fields for input 
public boolean validateFields()
{
  if (! validateField( fieldFirstName, "Please enter a first name")
    return false;
  else
  if (! validateField( fieldLastName, "Please enter a last name")
    return false;
  else
  if (! validateInteger( fieldAge, "Please enter an age greater then 0")
    return false;
  else
    return true;
}

// test if field is empty
public boolean validateField( JTextField f, String errormsg )
{
  if ( f.getText().equals("") )
    return failedMessage( f, errormsg );
  else
    return true; // validation successful
}

public boolean validateInteger( JTextField f, String errormsg )
{
  try
  {  // try to convert input to integer
    int i = Integer.parseInt(f.getText());

    // input must be greater then 0
    // if it is, success
    if ( i > 0 )
      return true; // success, validation succeeded
   }
   catch(Exception e)
   {
      // if conversion failed, or input was <= 0,
      // fall-through and do final return below
   }
   return failedMessage( f, errormsg );
}

public boolean failedMessage(JTextField f, String errormsg)
{
  JOptionPane.showMessageDialog(null, errormsg); // give user feedback
  f.requestFocus(); // set focus on field, so user can change
  return false; // return false, as validation has failed
}