Piamoon
Piamoon

Reputation: 105

Exception handling in JTextField

I am writing a restaurant application. enter image description here

In this part, in order to add cook, user needs to enter cook's name in a nameTextField and cook's salary in a salaryTextField and at the name part I want to prevent the user from entering numbers and at the salary part I want to prevent the user from entering words. For salary part I tried to use exception handling but couldn't really succeed.

class AddButtonInCookClick implements ActionListener{

                public void actionPerformed(ActionEvent e) {
                    String name = (String)nameTextFieldCook.getText();
                    double salary = new Double(0.0);
                    try {
                        salary = Double.parseDouble(salaryTextField.getText());
                    }catch(NumberFormatException ex) {
                        System.out.println(ex);
                    }
                    restaurant.getEmployees().add(new Cook(id, name, salary));
                    id++;
                    JOptionPane cookOptionPane = new JOptionPane();
                    JOptionPane.showMessageDialog(cookOptionPane, "Cook added succesfully.");

                }   
            }
            addButtonInCook.addActionListener(new AddButtonInCookClick());

Even though the program doesn't crush. I still can't make user enter numbers for salary part. Thank you for helping.

Upvotes: 0

Views: 122

Answers (1)

MarsAtomic
MarsAtomic

Reputation: 10696

You can restrict input solely to numerals by using JFormattedTextField in lieu of a normal JTextField.

Sample code:

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import java.text.NumberFormat;
import javax.swing.text.NumberFormatter;

public class Test extends JFrame
{
  JFormattedTextField salaryFormattedTextField;
  NumberFormat numberFormat;
  NumberFormatter numberFormatter;

  public Test()
  {
    numberFormat = NumberFormat.getInstance();
    // delete line if you want to see commas or periods grouping numbers based on your locale
    numberFormat.setGroupingUsed(false);           

    numberFormatter = new NumberFormatter(format);
    numberFormatter.setValueClass(Integer.class);
    // delete line if you want to allow user to enter characters outside the value class.
    // Deleting the line would allow the user to type alpha characters, for example.
    // This pretty much defeats the purpose of formatting
    numberFormatter.setAllowsInvalid(false);

    salaryFormattedTextField = new JFormattedTextField(formatter);

    this.add(salaryFormattedTextField);
  }

  public static void main(String[] args)
  {
    Test test = new Test();
    s.pack();
    s.setVisible(true);
  }
}

The alternative, using the code structure you already have, is to throw up a JOptionPane when the input doesn't parse correctly.

try
{
    salary = Double.parseDouble(salaryTextField.getText());
    restaurant.getEmployees().add(new Cook(id, name, salary));
    id++;
    JOptionPane cookOptionPane = new JOptionPane();
    JOptionPane.showMessageDialog(cookOptionPane, "Cook added succesfully.");
}
catch(NumberFormatException ex)
{
    JOptionPane cookFailPane = new JOptionPane();
    JOptionPane.showMessageDialog(cookFailPane , "Could not add cook. Please enter salary using only numeric input.");
    ex.printStackTrace();
}

Upvotes: 2

Related Questions