Validar campos JTextField?

Gostaria de saber o que estou fazendo de errado tenho duas classe uma o visual e outra para a validação se que ao digitar um valor abaixo do minimo irá ficar cinza ao chegar o valor normal irá ficar na cor branca e ao dar o limite deverá travar e ao passar o mouse sobre o campo dirá mostrar uma mensagem de alerta com o que falta ou o quanto resta a digitar.

Porem se eu colocar um ele em um JTextField na classe somente valida.
agora se eu colocar vários ele somente limita mas não troca as cores e nem mostra o alter corretamente

Segue abaixo o código

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;

public class Autocorecao extends JFrame {

    private JPanel contentPane;
    private JTextField textField;
    private JTextField textField_1;
    private JTextField textField_2;
    private JTextField textField_3;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Autocorecao frame = new Autocorecao();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });}

        public Autocorecao() {

            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            setBounds(100, 100, 276, 261);
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            setContentPane(contentPane);
            contentPane.setLayout(null);

            textField = new JTextField();
            textField.setBounds(10, 23, 191, 20);
            contentPane.add(textField);
            textField.setColumns(10);
            Tamanho_campo t = new Tamanho_campo();
            t.TratarJtextField(2,12,textField);

            textField_1 = new JTextField();
            textField_1.setColumns(10);
            textField_1.setBounds(10, 69, 191, 20);
            contentPane.add(textField_1);
            t.TratarJtextField(3,6,textField_1);

            textField_2 = new JTextField();
            textField_2.setColumns(10);
            textField_2.setBounds(10, 110, 191, 20);
            contentPane.add(textField_2);
            t.TratarJtextField(5,10,textField_2);


            textField_3 = new JTextField();
            textField_3.setColumns(10);
            textField_3.setBounds(10, 155, 191, 20);
            contentPane.add(textField_3);
            t.TratarJtextField(4,8,textField_3);

            JLabel lblNewLabel = new JLabel("min 2 max 12");
            lblNewLabel.setBounds(10, 11, 191, 14);
            contentPane.add(lblNewLabel);

            JLabel lblMinMax = new JLabel("min 3 max 6");
            lblMinMax.setBounds(10, 54, 191, 14);
            contentPane.add(lblMinMax);

            JLabel lblMinMax_1 = new JLabel("min 5 max 10");
            lblMinMax_1.setBounds(10, 96, 191, 14);
            contentPane.add(lblMinMax_1);

            JLabel lblMinMax_2 = new JLabel("min 4 max 8");
            lblMinMax_2.setBounds(10, 141, 191, 14);
            contentPane.add(lblMinMax_2);


    }
}


Validação:




package lucas.funcao;

import java.awt.Color;

import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.PlainDocument;

import softmoby.com.br.Teste.DocumentSizeFilter;

public class Tamanho_campo  extends PlainDocument {

    public static JTextField textArea;
    public static DefaultStyledDocument doc;
    public static int maximo1=0;
    public static int minimo1=0;
    public static JTextField t;
    public static String t_conteudo;

    public void TratarJtextField(int minimo,int maximo,JTextField textArea) {  
        t= textArea;
        maximo1 =maximo;
        minimo1=minimo; 
        doc = new DefaultStyledDocument();
        doc.setDocumentFilter(new DocumentSizeFilter(maximo));


        doc.addDocumentListener(new DocumentListener() {

            @Override
            public void changedUpdate(DocumentEvent e) {
                updateCount();
            }

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

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

        textArea.setDocument(doc);
        updateCount();
    }


    private static void updateCount() {

        int quan =0;
        try {
            quan = doc.getLength();
        } catch (Exception e) {

        }

        if(minimo1>quan){
            t.setBackground(Color.LIGHT_GRAY);
            String q = Integer.toString(quan-minimo1).replaceAll("\\D", "");
            t.setToolTipText("Precisa mais "+q+" caracter");
        }

        if(minimo1<=quan){

            String q = Integer.toString(maximo1-quan).replaceAll("\\D", "");
            t.setToolTipText("Restam "+q+" caracter");
            t.setBackground(Color.WHITE);
        }

    }

}

É que você fez um monte de coisa estática onde não deveria ser.

Assim vai resolver::

import java.awt.Color;

import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.DefaultStyledDocument;

import softmoby.com.br.Teste.DocumentSizeFilter;

public class Tamanho_campo {

	private class UpdateListener implements DocumentListener {

		final JTextField textField;
		final DefaultStyledDocument doc;
		final int minimo;
		final int maximo;

		public UpdateListener(JTextField textField, DefaultStyledDocument doc, int minimo, int maximo) {
			this.textField = textField;
			this.doc = doc;
			this.minimo = minimo;
			this.maximo = maximo;
		}

		@Override
		public void changedUpdate(DocumentEvent e) {
			updateCount();
		}

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

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

		private void updateCount() {
			int quantidade = doc.getLength();
			if (minimo > quantidade) {
				textField.setBackground(Color.LIGHT_GRAY);
				int precisa = quantidade - minimo;
				textField.setToolTipText("Precisa mais " + precisa + " caracteres");
			}
			if (minimo <= quantidade) {
				int restam = maximo - quantidade;
				textField.setToolTipText("Restam " + restam + " caracteres");
				textField.setBackground(Color.WHITE);
			}
		}
	};

	public void tratarJTextField(int minimo, int maximo, JTextField textField) {
		DefaultStyledDocument doc = new DefaultStyledDocument();
		doc.setDocumentFilter(new DocumentSizeFilter(maximo));
		UpdateListener updateListener = new UpdateListener(textField, doc, minimo, maximo);
		doc.addDocumentListener(updateListener);
		textField.setDocument(doc);
		updateListener.updateCount();
	}
}

É possível dentro desta classe de validação uma forma de colocar o tipo de caracter que eu quero usar tipo somente letras, somente numero entre outros tipos.

	private void jTextFieldKeyTyped(KeyEvent evt) { 
	String caracteres="";
 
    switch (tipo) {
        case "N":
        	caracteres="0987654321.";
            break;
        case "v":
        	caracteres="aeiou.";
        	break;
        default:
     }
	
	
	if(!caracteres.contains(evt.getKeyChar()+"")){
		evt.consume(); 
	}

	
	if((getText().length()>=getMaximoCaracteres())&&(getMaximoCaracteres()!=-1)){
		evt.consume(); 
		setText(getText().substring(0,getMaximoCaracteres())); 
	}
}