2

What I am trying to do is this, when I enter the details it will validate if the textFiled is empty when a button is pressed, if it is empty it will display a message saying that. Then it will move to the next textFile similar to many web based registration forms, what I am trying to find out is why wont the message change?

Pasting this code into an ecilpse file and running it should display the simple frame and what I am trying to do.

The message displays on the bottom of the frame when the firstname field is empty, can anyone explain why it doesn't show the next message when the firstname field containes text and the middlename contains no text?

Most of the logic is at the bottom of the code.

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Color;
import javax.swing.UIManager;
import javax.swing.JPanel;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;
import com.jgoodies.forms.factories.FormFactory;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.Font;
import javax.swing.SwingConstants;
import javax.swing.JRadioButton;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.JButton;
import javax.swing.JComboBox;

public class start {

private JFrame frame;
private JTextField tfFirstname;
private JTextField tfMiddlenames;
private JTextField tfSurname;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                start window = new start();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public start() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();

    frame.setBounds(100, 100, 505, 429);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


    frame.getContentPane().setLayout(null);

    final JPanel panelClientNew = new JPanel();
    panelClientNew.setBackground(new Color(0, 102, 255));
    panelClientNew.setBounds(10, 11, 469, 299);
    frame.getContentPane().add(panelClientNew);
    panelClientNew.setLayout(null);

    JLabel lblFirstname = new JLabel("Firstname :");
    lblFirstname.setHorizontalAlignment(SwingConstants.RIGHT);
    lblFirstname.setVerticalAlignment(SwingConstants.BOTTOM);
    lblFirstname.setForeground(new Color(255, 255, 255));
    lblFirstname.setFont(new Font("Tahoma", Font.BOLD, 13));
    lblFirstname.setBounds(10, 16, 163, 14);
    panelClientNew.add(lblFirstname);

    tfFirstname = new JTextField();
    tfFirstname.setFont(new Font("Tahoma", Font.PLAIN, 13));
    tfFirstname.setBounds(177, 10, 282, 27);
    panelClientNew.add(tfFirstname);
    tfFirstname.setColumns(10);

    JLabel lblMiddlenames = new JLabel("Middlenames :");
    lblMiddlenames.setHorizontalAlignment(SwingConstants.RIGHT);
    lblMiddlenames.setForeground(new Color(255, 255, 255));
    lblMiddlenames.setFont(new Font("Tahoma", Font.BOLD, 13));
    lblMiddlenames.setBounds(10, 47, 163, 14);
    panelClientNew.add(lblMiddlenames);

    tfMiddlenames = new JTextField();
    tfMiddlenames.setFont(new Font("Tahoma", Font.PLAIN, 13));
    tfMiddlenames.setBounds(177, 41, 282, 27);
    panelClientNew.add(tfMiddlenames);
    tfMiddlenames.setColumns(10);

    JLabel lblSurname = new JLabel("Surname :");
    lblSurname.setHorizontalAlignment(SwingConstants.RIGHT);
    lblSurname.setForeground(new Color(255, 255, 255));
    lblSurname.setFont(new Font("Tahoma", Font.BOLD, 13));
    lblSurname.setBounds(10, 78, 163, 14);
    panelClientNew.add(lblSurname);

    tfSurname = new JTextField();
    tfSurname.setFont(new Font("Tahoma", Font.PLAIN, 13));
    tfSurname.setBounds(177, 72, 282, 27);
    panelClientNew.add(tfSurname);
    tfSurname.setColumns(10);



    JButton btnAdd = new JButton("Add");
    btnAdd.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent arg0) {
            /*
             * 
             * 
             *
             *I am trying to create a message that validates on certain circumstances
             * 
             * 
             * 
             */

            if(tfFirstname.getText().equals(null) || tfFirstname.getText().equals("") || tfFirstname.getText().equals(false)) {
                JPanel panelMessage = new JPanel();
                panelMessage.setBackground(new Color(30, 144, 255));
                panelMessage.setBounds(10, 321, 469, 29);
                frame.getContentPane().add(panelMessage);

                JLabel lblPersonSaved = new JLabel("Please Enter Firstname :");
                lblPersonSaved.setForeground(new Color(255, 255, 255));
                lblPersonSaved.setFont(new Font("Tahoma", Font.BOLD, 15));
                panelMessage.add(lblPersonSaved);
                frame.revalidate();
                panelMessage.revalidate();
                frame.repaint();

            }
            else if (tfMiddlenames.getText().equals(null) || tfMiddlenames.getText().equals("") || tfMiddlenames.getText().equals(false)) {
                JPanel panelMessage = new JPanel();
                panelMessage.setBackground(new Color(30, 144, 255));
                panelMessage.setBounds(10, 321, 469, 29);
                frame.getContentPane().add(panelMessage);

                JLabel lblPersonSaved = new JLabel("Please Enter Middlenames :");
                lblPersonSaved.setForeground(new Color(255, 255, 255));
                lblPersonSaved.setFont(new Font("Tahoma", Font.BOLD, 15));
                panelMessage.add(lblPersonSaved);

                frame.revalidate();
                panelMessage.revalidate();
                frame.repaint();

            }
            else if (tfSurname.getText().equals(null) || tfSurname.getText().equals("") || tfSurname.getText().equals(false)) {
                JPanel panelMessage = new JPanel();
                panelMessage.setBackground(new Color(30, 144, 255));
                panelMessage.setBounds(10, 321, 469, 29);
                frame.getContentPane().add(panelMessage);

                JLabel lblPersonSaved = new JLabel("Please Enter Surname :");
                lblPersonSaved.setForeground(new Color(255, 255, 255));
                lblPersonSaved.setFont(new Font("Tahoma", Font.BOLD, 15));
                panelMessage.add(lblPersonSaved);
                frame.revalidate();
                panelMessage.revalidate();
                frame.repaint();

            }
            else {


                //Validation has passed

            }
        }
    });
    btnAdd.setBounds(370, 265, 89, 23);
    panelClientNew.add(btnAdd);





}
}
mKorbel
  • 109,525
  • 20
  • 134
  • 319
Aaron
  • 11,239
  • 18
  • 58
  • 73
  • 2
    If the JTextField is empty, shouldn't the focus remain with that JTextField so that the error can be fixed? As an aside, you'll want to read up and learn to use the AWT/Swing layout managers rather than this `setBounds(...)` business. It may not seem like it, but absolute positioning in the long run will make your work harder. – Hovercraft Full Of Eels Jun 14 '12 at 22:52
  • Yes sir, that is my aim as I think that will make the data validation more secure if I prevent entry into the next text field if the previous text filed is invalid. I also think with the message displayed it will make it more user friendly in the long run, I am still very new to swing gui programming and am yet to explore all the capabilities besides the basics. – Aaron Jun 14 '12 at 23:07
  • Consider using an InputVerifier for your JTextFields. – Hovercraft Full Of Eels Jun 14 '12 at 23:13

2 Answers2

4

I recommend that you use an InputVerifier as this will verify that the contents of the JTextField are correct (any way that you wish to define this) before allowing you to even leave the JTextField. Now it won't stop you from pressing other JButtons and whatnot, so you'll need to take other precautions if you have a submit button. An example of a simple InputVerifier that checks to see if the JTextField is empty is shown below:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class InputVerifierExample extends JPanel {
   public static final Color WARNING_COLOR = Color.red;
   private JTextField firstNameField = new JTextField(10);
   private JTextField middleNameField = new JTextField(10);
   private JTextField lastNameField = new JTextField(10);
   private JTextField[] nameFields = { 
         firstNameField, 
         middleNameField,
         lastNameField };
   private JLabel warningLabel = new JLabel("  ");

   public InputVerifierExample() {
      warningLabel.setOpaque(true);

      JPanel namePanel = new JPanel();
      namePanel.add(new JLabel("Name:"));
      MyInputVerifier verifier = new MyInputVerifier();
      for (JTextField field : nameFields) {
         field.setInputVerifier(verifier);
         namePanel.add(field);
      }
      namePanel.add(new JButton(new SubmitBtnAction()));

      setLayout(new BorderLayout());
      add(namePanel, BorderLayout.CENTER);
      add(warningLabel, BorderLayout.SOUTH);
   }

   private class SubmitBtnAction extends AbstractAction {
      public SubmitBtnAction() {
         super("Submit");
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         // first check all fields aren't empty
         for (JTextField field : nameFields) {
            if (field.getText().trim().isEmpty()) {
               return;  // return if empty
            }
         }
         String name = "";
         for (JTextField field : nameFields) {
            name += field.getText() + " ";
            field.setText("");
         }
         name = name.trim();
         JOptionPane.showMessageDialog(InputVerifierExample.this, name, "Name Entered",
               JOptionPane.INFORMATION_MESSAGE);
      }
   }

   private class MyInputVerifier extends InputVerifier {

      @Override
      public boolean verify(JComponent input) {
         JTextField field = (JTextField) input;
         if (field.getText().trim().isEmpty()) {
            warningLabel.setText("Please do not leave this field empty");
            warningLabel.setBackground(WARNING_COLOR);
            return false;
         }
         warningLabel.setText("");
         warningLabel.setBackground(null);
         return true;
      }

   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("InputVerifier Example");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new InputVerifierExample());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
3
  1. have look at DocumentListener,

  2. on start_up to enable only first JTextField, if any (up to you) character was typed into first JTextField, then enable second JTextField, and so on...,

  3. if you want to filtering, change or replace output came from keyboard the to use DocumentFilter

  4. change background for example to Color.red (from DocumentListeners events), in the case that one of JTextFields contains incorect lenght, data e.g.

  5. agree with HFOE about LayoutManagers

Community
  • 1
  • 1
mKorbel
  • 109,525
  • 20
  • 134
  • 319
  • I don't agree with this advice as a DocumentFilter is for checking text added to a text component before it is displayed. I still think that an InputVerifier would work better. I'll work on an example... – Hovercraft Full Of Eels Jun 14 '12 at 23:27
  • I don't agree with InputVerifier, Document is Model for JTextComponent, for real code you have to write verifications twice, (sure could be possible with InputVerifier) DocumentFilter can take InputMask from enum of InputMask on fly, sorry maybe I'll be bothering with NavigationsFilter together with Document +1 for great code – mKorbel Jun 14 '12 at 23:37
  • It's also a lot easier to use an InputVerifier than a DocumentFilter. 1+ for the advice as DocumentFilters are useful tools and would be helpful for the OP to learn about. – Hovercraft Full Of Eels Jun 14 '12 at 23:37