Validação Dinâmica

29 respostas
guilherme.dio

Gostaria de saber se é uma boa prática eu criar um método padrão em uma classe separada para fazer a validação dinâmica dos forms de meu programa, assim eu nao teria que fazer um codigo de validação diferente para cada form, então pensei em fazer um método nessa estrutura

public boolean Valida(Object form)
{

}

e dentro deste método criaria toda uma lógica para identificar todos os components dentro variável que passei no parametro, que provavlemente seria um JPanel com varios jtextfields, combobox e etc… consultaria se possui valor nesses components, caso contrario retorno false

porém eu n sei se isso será possível, no tipo Object consigo fazer essa validação genérica?

29 Respostas

R

pq vc não passa um frame?

dae dentro desse método vc verifica se tem paineis dae os paineis vc verifica os componentes… e se não tem paineis vc verifica se o frame tem componentes

bem mais simples…

guilherme.dio

é axo que fica mais simplificado, porém é mehlor passar um Panel, ai no caso do JFrame, eu passaria o getContentPane()…

porém, estou com uma dúvida, e quanto ao JInternalFrame, o panel padrão dele também é o ContentPane() ?

R

sim

mas eu disse pra vc passar um frame pq vc pode pegar o painel la dentro

ou vários painéis se houver mais de 1 no frame e verificar 1 por 1

onde eu trabalhava era assim… mas gosto eh gosto =p

guilherme.dio

más há um porém, minha app é constituida por JFrames e JInternalFrames

entao n posso passa ro JFrame, nesse caso teria que passar um Object, oque seria mais complicado

R
public boolean valida( Jframe frame ) {

ArrayList<JPanel> paineis = new ArrayList<JPanel>;

for ( int i = 0; i < frame.getComponentCount(); i++ ) {

   if ( frame.getComponentAt(i) instanceof JPanel ) 
      paineis.add(i);
   
   return validaPaineis( paineis );
}

public boolean valida( JInternalFrame frame ) {
// o mesmo que o JFrame
}

private boolean validaPaineis( ArrayList<JPanel> paineis ) {
// faz a validação de todos os paineis do array, componente por componente
// retorna true se as validações estão ok
// retorna false se houver algum problema e armazena esse problema em alguma variavel.. nesse caso vc pode resgatar o problema  posteriormente se quiser
}

melhor passar frames do que paineis... imagina vc ter 4 paineis cada frame em um aplicativo com 15 frames.. e precisando passar 1 painel de cada vez?
e outra... dentro do método validaPaineis vc pode fazer um FOR e criar um método para validar painel por painel.. se quiser validar um painel específico no seu sistema, vc usa esse método ao invés do frame entendeu?

guilherme.dio

A é verdade, esqueci da possibilidade de usar Override…rsrsrs

Obrigado!

guilherme.dio

Esta terrível fazer a validação do meu JInternalFrame, primeiro pq qdo eu passo de parâmetro o frame inteiro, e pego os components dele, somente dois vem, um JDesktopPane e um outro, entao peguei o desktoppane para ver, e tinha dentro dele o meu internalframe, e dentro dele eu deveria pegar o tabbedpane, dentro do tabbedpane procurar a aba que quero validar, e dentro dessa aba pegar todos os panels…

horrível, horrível MESMO!

alguém tem alguma colução para essa gambiarra que nao da certo?

R

nossa… hahaha… pq vc iria querer validar todos os internalframe de um desktoppane?

acho que a lógica de programação sua que está complicada… tente validar apenas aquele jinternalframe que está ativo e tem focus… assim q ele perde o focus e ganha o focus vc valida ele entende? se quiser validar paineis dentro de um jdesktoppane… ae o código vai ficar monstruoso como vc disse…

no sistema que eu mexia, as validações de frame eram realizadas: ao salvar (carregar, update etc), ao perder foco (nesse caso se houvesse um valor inválido em um campo aquele campo era limpado) e a o ganhar foco (apenas para efeito de corrigir algo que foi modificado em outra tela e tinha efeito nessa)

guilherme.dio

Inclusive, estou passar o JInternalFrame inteiro como parâmetro, e qdo uso o getComponentCount nele, me retorna somente 2 components !!! estranho

guilherme.dio

não reddragon, vc nao entendeu

estou passando o JInternalFrame, porém ao varrer os components dele, só me retorna dois components, o desktoppane() e um que nunca ouvi falar BasicInternalFrame…alguma coisa…

no ComponentCount retorna somente 2

public boolean Valida(JInternalFrame frame)
    {
        //Lista de JPanels
        List<JPanel> panel = new ArrayList();
        
        //Adiciona todos os JPanels à List<JPanel>
        for(int i=0;i<frame.getComponentCount();i++)
        {
            
            if(frame.getComponent(i) instanceof JPanel)
            {
                panel.add((JPanel)frame.getComponent(i));
            }
        }
        
        //Retorna o resultado do método Valida(List<JPanel)
        return Valida(panel);
    }
guilherme.dio

SynthInternalFrameTitlePane…este é o nome do outro component que aparece nso components do JInternalFrame, além do JRootPane

R

é que com jInternalFrame é meio diferente… os componentes ficam no LayeredPane… testa ae pra vc ver…
como nao mexi muito com internalFrame na vida, não sei se existe possibilidade de haver mais de um layeredPane… pq dae vc teria que usar o for pra cada um deles… faz os testes ae

for ( int i = 0; i < telaCadCliente.getLayeredPane().getComponentCount(); i++ ) { seuInternalFrame.getLayeredPane().getComponent(i); }

guilherme.dio

me retorno somente 2 components

rsrsrs…ta complicado isso, to ficando intrigado já, estou desde as 2 horas sentado aqui no meu quarto programando, nao aguento mais, aushaushusa, axo que nem o Mestre Vini resolve essa de primeira

R

aqui funcionou perfeitamente… vou te passar o código que usei para teste…

package principal;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class Testes extends JFrame implements ActionListener {

	private JMenuBar jmPrincipal = new JMenuBar();
	private JMenu jmCadastro = new JMenu("Cadastros");
	private JMenuItem jmCadCliente = new JMenuItem("Cliente");
	private JMenuItem jmCadFornecedor = new JMenuItem("Fornecedor");

	public JDesktopPane jdPane = new JDesktopPane();

	Tela telaCadCliente, telaCadFornecedor, telaCadProduto;

	public static void main(String args[]) {
		Testes menu = new Testes();
	}

	public Testes() {
		getContentPane().add(jdPane);
		jmPrincipal.add(jmCadastro);
		jmCadastro.add(jmCadCliente);
		jmCadastro.add(jmCadFornecedor);
		setJMenuBar(jmPrincipal);
		jmCadCliente.addActionListener(this);
		jmCadFornecedor.addActionListener(this);
		setSize(800,600);
		setVisible(true);
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
	}

	public void actionPerformed(ActionEvent evt) {

		if (evt.getSource() == jmCadCliente) {
			if (telaCadCliente == null)
				telaCadCliente = new Tela("Cadastro de Cliente", this);

            ArrayList<JPanel> paineis = new ArrayList<JPanel>();
			// testes para guj... capturando os elementos de um jInternalFrame
			for ( int i = 0; i < telaCadCliente.getLayeredPane().getComponentCount(); i++ ) {
				paineis.add( (JPanel) telaCadCliente.getLayeredPane().getComponent(i));
			}
			jdPane.moveToFront(telaCadCliente);
		}

		if (evt.getSource() == jmCadFornecedor) {
			if (telaCadFornecedor == null)
				telaCadFornecedor = new Tela("Cadastro de Fornecedor", this);

			jdPane.moveToFront(telaCadFornecedor);
		}
	}
}

class Tela extends JInternalFrame {

	private Testes telaPrincipal;

	public Tela(String titulo, Testes telaPrincipal) {
		super(titulo);
		setSize(300,200);
		setVisible(true);
		JButton botao = new JButton( "OK" );
		botao.setBounds(0, 0, 50, 50);
		add(botao);

		this.telaPrincipal = telaPrincipal;
		telaPrincipal.jdPane.add(this);
	}
}
guilherme.dio

nossa que estranho…eu ja to perdido agora, mto estranho, será que é o fato de eu estar desenhando no netbeans a parte gráfica?

apesar que nao, pq eu passo o JInternalFrame genéricamente, deveria funcionar…

da uma olhada estou fazendo isso:

public boolean Valida(JInternalFrame frame)
    {
        //Lista de JPanels
        List<JPanel> panel = new ArrayList();
        
        //Adiciona todos os JPanels à List<JPanel>
        for(Component comp : frame.getContentPane().getComponents())
        {
            if(comp instanceof JPanel)
            {
                panel.add((JPanel)comp);
            }
        }
        
        //Retorna o resultado do método Valida(List<JPanel)
        return Valida(panel);
    }
guilherme.dio

aaaaaa…fiz um debug no seu codigo, e puis um getComponent(n)…e adivinha oq? nao apareceu o seu botao, apareceu o JRootPane

R

nahh... meu código está funcionando.. vc fez algo errado.

vc nao pode dar um getContentPane no jinternalFrame...

vc ja testou daquele jeito?

public boolean Valida(JInternalFrame frame)  
    {  
        //Lista de JPanels  
        List<JPanel> panel = new ArrayList();  
          
        //Adiciona todos os JPanels à List<JPanel>  
        for(Component comp : frame.getLayeredPane().getComponents())  
        {  
            if(comp instanceof JPanel)  
            {  
                panel.add((JPanel)comp);  
            }  
        }  
          
        //Retorna o resultado do método Valida(List<JPanel)  
        return Valida(panel);  
    }
R

se meu código estivesse errado daria um erro pq to adicionando direto no arraylist entende?

guilherme.dio

fnalmente, consegui… no JInternalFrame, ele possui um JPanel dominando tudo após o LayeredPane, aogra está tudo dentro dele…só vou ter um pouco de trabalho pq tenho um JTabbedPane que possui 3 abas, vou tentar deixar o mais dinâmico possível

guilherme.dio

Agora estou com outro probleminha, hehe…meu JInternalFrame possui JPanels com outros JPanels dentro, o JPanel superior a estes tbm possui os Components que estao dentro desses JPanels filhos, ou terei que varrer Panel por Panel ?

R

adiciona esse “painel pai” no array tb… assim como adiciona os outros paineis

no outro método vc vai procurar os componentes… independente se tem painel dentro de painel entende?

guilherme.dio

no metodo que pego os components do Panel, devo procurar somente por textfields, e outro deste tipo, outro panels nao será necessario entao? mesmo que possua encadeamento de panels ?

R

acho que o unico caso de painel dentro de painel é este dae… do jinternalFrame

é dificil, e pouco aconselhavel, colocar paineis dentro de paineis =)

guilherme.dio

Foi necessário, eu estou usando o jTabbedPane, então preciso de um JPanel dentro dele para funcionar

R

faça isso mesmo então… =)
se der tudo certo coloca resolvido no título

guilherme.dio

Vai ficar monstruoso, rsrsrsrssr, n tem jeito, tenho que fazer até mesmo recursividade para varrer novmente os panels que estao encadeados

R

pq vc não faz a validação apenas no tabbedpanel dentro do internal frame? tem coisas no internalframe que estão fora do tabbedpanel?

guilherme.dio

não
mas vou tentar terminar minha lógica pq quero deixar completamente dinâmico isso aqui…estou quebrando a cabeça, rsrsrs

guilherme.dio

Terminei, se algum dia alguem precisar ai está:

package Principal;

//<editor-fold defaultstate="collapsed" desc="Importações">
import javax.swing.*;
import java.awt.Component;
import java.util.ArrayList;
import java.util.List;
import com.toedter.calendar.JTextFieldDateEditor;
//</editor-fold>

public class clsValidacao 
{
    private String erro;
    
    private void setErro(String erro)
    {
        this.erro = erro;
    }
    
    public String getErro()
    {
        return erro;
    }
    
    public clsValidacao()
    {
        erro = "";
    }
    
    public boolean Valida(JFrame frame)
    {
        //Lista de JPanels
        List<JPanel> panel = new ArrayList();
        
        //Adiciona todos os JPanels à List<JPanel>
        for(int i=0;i<frame.getComponentCount();i++)
        {
            if(frame.getComponent(i) instanceof JPanel)
            {
                panel.add((JPanel)frame.getComponent(i));
            }
        }
        //Retorna o resultado do método Valida(List<JPanel)
        return Valida(panel);
    }
    
    public boolean Valida(JInternalFrame frame)
    {
        //Lista de JPanels
        List<JPanel>  panel = new ArrayList();
        JPanel pnl = (JPanel)frame.getLayeredPane().getComponent(0);
        
        //Adiciona todos os JPanels à List<JPanel>
        for(Component comp : pnl.getComponents())
        {
            if(comp instanceof JTabbedPane)
            {
                JTabbedPane tabbed = (JTabbedPane)comp;
                for(Component c : tabbed.getComponents())
                {
                    panel.add((JPanel)c);
                }
                return Valida(panel);
            }
            else
            {
                if(panel.isEmpty())
                    panel.add(pnl);
            }
        }
        
        //Retorna o resultado do método Valida(List<JPanel)
        return Valida(panel);
    }
    
    public boolean Valida(JInternalFrame frame,String nome)
    {
        //Lista de JPanels
        List<JPanel>  panel = new ArrayList();
        JPanel pnl = (JPanel)frame.getLayeredPane().getComponent(0);
        frame.getLayeredPane().getComponents();
        //JTabbedPane teste = (JTabbedPane) pnl.getComponent(0);
        //JPanel test = (JPanel) teste.getComponent(0);
        //teste.getComponentCount(); 
        
        //Adiciona todos os JPanels à List<JPanel>
        for(Component comp : pnl.getComponents())
        {
            if(comp instanceof JTabbedPane)
            {
                JTabbedPane tabbed = (JTabbedPane)comp;
                for(Component c : tabbed.getComponents())
                {
                    if(c.getName().equals(nome))
                        panel.add((JPanel)c);
                }
                return Valida(panel);
            }
            else
            {
                if(panel.isEmpty())
                    panel.add(pnl);
            }
        }
        
        //Retorna o resultado do método Valida(List<JPanel)
        return Valida(panel);
    }
    
    private boolean Valida(List<JPanel> panel)
    {
        for(JPanel pnl : panel)
        {
            Valida(pnl);
        }
        if(getErro().isEmpty())
            return false;
        else
            return true;
    }
    
    private void Valida(JPanel panel)
    {
        for(Component comp : panel.getComponents())
        {
            if(comp instanceof JPanel)
            {
                Valida((JPanel)comp);
            }
            else
            {
                if(comp instanceof JFormattedTextField)
                {
                    
                }
                if(comp instanceof JTextFieldDateEditor)
                {
                    
                }
                if(comp instanceof JTextField)
                {
                    Valida((JTextField)comp);
                }
            }
        }
    }
    
    private void Valida(JTextField txt)
    {
        if(txt.getText().isEmpty() && txt.getName() != null)
        {
            if(getErro().isEmpty())
            {
                setErro("Erro - Preencha os campos abaixo:\n");
                setErro(getErro()+txt.getName()+"\n");
            }
            else
            {
                setErro(getErro()+txt.getName()+"\n");
            }
        }
    }
Criado 16 de junho de 2011
Ultima resposta 18 de jun. de 2011
Respostas 29
Participantes 2