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?
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…
é 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() ?
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
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
[code]
public boolean valida( Jframe frame ) {
ArrayList paineis = new ArrayList;
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 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
}[/code]
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?
A é verdade, esqueci da possibilidade de usar Override…rsrsrs
Obrigado!
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?
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)
Inclusive, estou passar o JInternalFrame inteiro como parâmetro, e qdo uso o getComponentCount nele, me retorna somente 2 components !!! estranho
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);
}
SynthInternalFrameTitlePane…este é o nome do outro component que aparece nso components do JInternalFrame, além do JRootPane
é 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);
}
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
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);
}
}
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);
}
aaaaaa…fiz um debug no seu codigo, e puis um getComponent(n)…e adivinha oq? nao apareceu o seu botao, apareceu o JRootPane
nahh… meu código está funcionando… vc fez algo errado.
vc nao pode dar um getContentPane no jinternalFrame…
vc ja testou daquele jeito?
[code]public boolean Valida(JInternalFrame frame)
{
//Lista de JPanels
List 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);
}[/code]
se meu código estivesse errado daria um erro pq to adicionando direto no arraylist entende?
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