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
publicbooleanValida(Objectform){}
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?
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
redr4gon
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
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
redr4gon
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…
SynthInternalFrameTitlePane…este é o nome do outro component que aparece nso components do JInternalFrame, além do JRootPane
R
redr4gon
é 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
redr4gon
aqui funcionou perfeitamente… vou te passar o código que usei para teste…
packageprincipal;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.util.ArrayList;importjavax.swing.JButton;importjavax.swing.JDesktopPane;importjavax.swing.JFrame;importjavax.swing.JInternalFrame;importjavax.swing.JMenu;importjavax.swing.JMenuBar;importjavax.swing.JMenuItem;importjavax.swing.JPanel;publicclassTestesextendsJFrameimplementsActionListener{privateJMenuBarjmPrincipal=newJMenuBar();privateJMenujmCadastro=newJMenu("Cadastros");privateJMenuItemjmCadCliente=newJMenuItem("Cliente");privateJMenuItemjmCadFornecedor=newJMenuItem("Fornecedor");publicJDesktopPanejdPane=newJDesktopPane();TelatelaCadCliente,telaCadFornecedor,telaCadProduto;publicstaticvoidmain(Stringargs[]){Testesmenu=newTestes();}publicTestes(){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);}publicvoidactionPerformed(ActionEventevt){if(evt.getSource()==jmCadCliente){if(telaCadCliente==null)telaCadCliente=newTela("Cadastro de Cliente",this);ArrayList<JPanel>paineis=newArrayList<JPanel>();// testes para guj... capturando os elementos de um jInternalFramefor(inti=0;i<telaCadCliente.getLayeredPane().getComponentCount();i++){paineis.add((JPanel)telaCadCliente.getLayeredPane().getComponent(i));}jdPane.moveToFront(telaCadCliente);}if(evt.getSource()==jmCadFornecedor){if(telaCadFornecedor==null)telaCadFornecedor=newTela("Cadastro de Fornecedor",this);jdPane.moveToFront(telaCadFornecedor);}}}classTelaextendsJInternalFrame{privateTestestelaPrincipal;publicTela(Stringtitulo,TestestelaPrincipal){super(titulo);setSize(300,200);setVisible(true);JButtonbotao=newJButton("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…
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
redr4gon
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
redr4gon
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
redr4gon
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
redr4gon
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á:
packagePrincipal;//<editor-fold defaultstate="collapsed" desc="Importações">importjavax.swing.*;importjava.awt.Component;importjava.util.ArrayList;importjava.util.List;importcom.toedter.calendar.JTextFieldDateEditor;//</editor-fold>publicclassclsValidacao{privateStringerro;privatevoidsetErro(Stringerro){this.erro=erro;}publicStringgetErro(){returnerro;}publicclsValidacao(){erro="";}publicbooleanValida(JFrameframe){//Lista de JPanelsList<JPanel>panel=newArrayList();//Adiciona todos os JPanels à List<JPanel>for(inti=0;i<frame.getComponentCount();i++){if(frame.getComponent(i)instanceofJPanel){panel.add((JPanel)frame.getComponent(i));}}//Retorna o resultado do método Valida(List<JPanel)returnValida(panel);}publicbooleanValida(JInternalFrameframe){//Lista de JPanelsList<JPanel>panel=newArrayList();JPanelpnl=(JPanel)frame.getLayeredPane().getComponent(0);//Adiciona todos os JPanels à List<JPanel>for(Componentcomp:pnl.getComponents()){if(compinstanceofJTabbedPane){JTabbedPanetabbed=(JTabbedPane)comp;for(Componentc:tabbed.getComponents()){panel.add((JPanel)c);}returnValida(panel);}else{if(panel.isEmpty())panel.add(pnl);}}//Retorna o resultado do método Valida(List<JPanel)returnValida(panel);}publicbooleanValida(JInternalFrameframe,Stringnome){//Lista de JPanelsList<JPanel>panel=newArrayList();JPanelpnl=(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(Componentcomp:pnl.getComponents()){if(compinstanceofJTabbedPane){JTabbedPanetabbed=(JTabbedPane)comp;for(Componentc:tabbed.getComponents()){if(c.getName().equals(nome))panel.add((JPanel)c);}returnValida(panel);}else{if(panel.isEmpty())panel.add(pnl);}}//Retorna o resultado do método Valida(List<JPanel)returnValida(panel);}privatebooleanValida(List<JPanel>panel){for(JPanelpnl:panel){Valida(pnl);}if(getErro().isEmpty())returnfalse;elsereturntrue;}privatevoidValida(JPanelpanel){for(Componentcomp:panel.getComponents()){if(compinstanceofJPanel){Valida((JPanel)comp);}else{if(compinstanceofJFormattedTextField){}if(compinstanceofJTextFieldDateEditor){}if(compinstanceofJTextField){Valida((JTextField)comp);}}}}privatevoidValida(JTextFieldtxt){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");}}}