0

I am trying to make a separate class using DocumentListener implementation to check weather TextFields are empty or not, so that can be added to multiple JTextFeilds. i have created DocumentListener implemented class and that have added to the TextField. i should be glad if someone help me with this problem.

Thanks in advance.

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

class Doc extends JFrame{
public JButton bttAdd;
public JButton bttRemove;
public JTextField txtEmplyee;
public JTextField txtName;
private JPanel paneCenter;

Doc(){
    setSize(500, 200);
    setTitle("Add Emplyee");

    paneCenter=new JPanel();
    bttAdd=new JButton("Add");
    bttRemove=new JButton("Remove");

    txtEmplyee = new JTextField(20);
    txtEmplyee.getDocument().addDocumentListener(new DocListner());

    txtName = new JTextField(20);


    bttAdd.setEnabled(false);

    paneCenter.add(txtEmplyee);
    paneCenter.add(txtName);
    paneCenter.add(bttAdd);
    paneCenter.add(bttRemove);

    add("Center", paneCenter);

  }
}

   class DocListner implements DocumentListener{

       @Override
       public void insertUpdate(DocumentEvent e) {
       statusChecker();
       }

       @Override
       public void removeUpdate(DocumentEvent e) {
       statusChecker();
       }

       @Override
       public void changedUpdate(DocumentEvent e) {
       statusChecker();
       }
       public void statusChecker(){
       Doc d2=new Doc();
       if(d2.txtEmplyee.getText().equals("")){
          d2.bttAdd.setEnabled(false);
       }else {
          d2.bttAdd.setEnabled(true);
     }
  }
}
  • I would link the `DocumentListener` back to another observer, which knows about the text fields, the `DocumentListener` could then generate "empty" and "not empty" events to which the observer could react to – MadProgrammer Feb 26 '17 at 07:33
  • It seems that you are using a bad class of listener. Try it out: `txtEmplyee.getDocument().addDocumentListener();`. You'll have to override a few interface methods. Here you can find an example: [stack answer](http://stackoverflow.com/questions/3953208/value-change-listener-to-jtextfield) – adgon92 Feb 26 '17 at 07:34

1 Answers1

1

Here is an example of a simple reusable class that will enable/disable a button as the text in related text fields is changed.

import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.event.*;

public class DataEntered implements DocumentListener
{
    private JButton button;
    private List<JTextField> textFields = new ArrayList<JTextField>();

    public DataEntered(JButton button)
    {
        this.button = button;
    }

    public void addTextField(JTextField textField)
    {
        textFields.add( textField );
        textField.getDocument().addDocumentListener( this );
    }

    public boolean isDataEntered()
    {
        for (JTextField textField : textFields)
        {
            if (textField.getText().trim().length() == 0)
                return false;
        }

        return true;
    }

    @Override
    public void insertUpdate(DocumentEvent e)
    {
        checkData();
    }

    @Override
    public void removeUpdate(DocumentEvent e)
    {
        checkData();
    }

    @Override
    public void changedUpdate(DocumentEvent e) {}

    private void checkData()
    {
        button.setEnabled( isDataEntered() );
    }

    private static void createAndShowUI()
    {
        JButton submit = new JButton( "Submit" );
        submit.setEnabled( false );

        JTextField textField1 = new JTextField(10);
        JTextField textField2 = new JTextField(10);

        DataEntered de = new DataEntered( submit );
        de.addTextField( textField1 );
        de.addTextField( textField2 );

        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(textField1, BorderLayout.WEST);
        frame.add(textField2, BorderLayout.EAST);
        frame.add(submit, BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

A couple of comments with the following statement:

add("Center", paneCenter);
  1. Don't use magic values. People don't know what the String means. The API will define variables you can use for the constraints of the layout.
  2. That is an old API. Read the API description and you will see you should be using the method with the signature of add(component, constraint).

So your code should be something like:

add(paneCenter, BorderLayout.CENTER);
camickr
  • 321,443
  • 19
  • 166
  • 288