terça-feira, 26 de fevereiro de 2008

NetBeans 6.0.1 - Herança visual

Finalmente existe a possibilidade de se conseguir fazer herança visual (dos forms) no NetBeans, não estou me referendo aos usuais templates que todos acabam mencionando... estou falando de herança mesmo, aquela que o Delphi oferece, ou seja, você cria um formulário padrão e depois herda as características deste formulário para outros, e quando você alterar o formulário padrão essas alterações são espelhadas nos seus "filhos", coisa que os templates não conseguem fazer.

Bom, segui fielmente o que contém nesse link http://wiki.netbeans.org/FaqFormExtendingForms

Mas pra tentar simplificar vou colocar os passos abaixo:

1) Crie um novo projeto
2) Crie um formulário que será o nosso padrão, pode ser um JFrame por exemplo, de o nome de BaseForm para ele e insira um método que retorne o JPanel vazio como um container, como no exemplo abaixo:

public Container getJPanel1() {
return jPanel1;
}

3) Insira os componentes que serão modelos para todos os formulários filhos
4) Insira um JPanel e deixe ele totalmente vazio
5) Você vai precisar criar uma classe chamada BaseFormBeanInfo e que o extends dela seja de SimpleBeanInfo, como no exemplo abaixo:

public class BaseFormBeanInfo extends java.beans.SimpleBeanInfo {
//public final static Class beanClass = BaseForm.class;
private BeanDescriptor beanDescriptor;

public BaseFormBeanInfo() {
super();
}

@Override
public BeanDescriptor getBeanDescriptor() {
if (beanDescriptor == null) {
// BaseForm é o formulário padrão
beanDescriptor = new BeanDescriptor(BaseForm.class);
// getJPanel1 é o nome do método que retorna o JPanel vazio que está no BaseForm
beanDescriptor.setValue("containerDelegate", "getJPanel1"); // g
}
return beanDescriptor;
}
}

ATENÇÃO: O nome BaseFormBeanInfo não é por acaso, tem que seguir esse padrão, caso o seu formulário padrão se chamasse PadraoForm a classe BeanInfo iria se chamar PadraoFormBeanInfo.

6) Compile o projeto
7) Vamos criar o formulário filho a partir do BaseForm, para isso crie um formulário do tipo "Formulário Bean" (BeanForm) e quando for solicitada qual é a superclasse informe "BaseForm" (sem as áspas é claro).
8) Pronto! Mas como nem tudo são flores, o que você vai visualizar no seu formulário filho é justamente aquele JPanel que foi inserido vazio na superclasse, é nele que você vai inserir os seus novos componentes, etc...

Agora você deve estar se perguntando... mas se eu tenho um botão de ok no BaseForm e quero mudar o seu modo de funcionamento, como poderia alterar no meu formulário herdado o código definido no BaseForm? Muito simples, no evento de click do botão no BaseForm você poderia colocar a chamada de um método seu, por exemplo:

cliqueOk();

Esse método você deve declarar como sendo protected dessa forma você redefine ele na sua classe herdada e ele passa a executar o código novo, caso contrário ele executa o código que foi definido na superclasse.

Se preferir faça download do projeto de exemplo aqui.

[]´s

10 comentários:

Edwar Saliba Júnior disse...

Boa tarde!

Sou ex-usuário de Delphi e iniciante em Java. Li seu artigo e diversos outros na internet, onde se tenta fazer herança visual no Netbeans.

Confesso que fiquei frustrado com os resultados obtidos.

Pra ser sincero, quando sigo os passos descritos no seu artigo ou em diversos outros que li, ainda assim não consigo, no formulário filho, ver os componentes do formulário pai e tampouco inserir novos componentes.

Talvez eu esteja fazendo algo errado. Como sou iniciante nesta ferramenta, pode ter acontecido.

Seria possível você postar um exemplo de código completo para que possamos testar a herança visual?

Obrigado!

Unknown disse...

Boa tarde Edwar,

Atualizei o post, inseri no final o link do projeto completo de exemplo.

Existe uma pequena particularidade na herança visual no netbeans, como o projeto de exemplo que eu fiz o formulário padrão (superclass) eu fiz a partir de um JFrame, ao herdar as características para o BeanForm você não vai conseguir ver os componentes que estão fora do JPanel (que obribatoriamente deve ter sido incluído vazio no formulário base), ou seja, ao abrir o seu formulário filho você verá apenas o JPanel vazio e é nele que você deve inserir os seus componentes, para que isso não aconteça você deve derivar o formulário padrão de alguma outra classe do tipo container que não o JFrame (é o que está descrito no link que tem uma documentação do wiki do netbeans que está no corpo do post), fiz várias experiências com relação a isso mas também não consegui visualizar os componentes do form padrão. Como não tenho acesso aos componentes (botões principalmente da superclasse) coloquei a dica do método de click do botão ok, assim pode-se alterar o código desse botão definido na superclasse através de um método protected na classe filha.

Se precisar de ajuda escreva.

[]´s

Juliano Soares disse...

Olá Jerônimo.
Li seu tutorial que ajudou bastante para me guiar com herança visual.
Tive alguns problemas, e não sei onde pode ter ocorrido.

Talvez você possa me ajudar.
Quando eu abro o formulário herdado, os componentes não aparecem no form. Ou melhor, eles parecem estar por trás do form e só aparecem quando eu passo o mouse por cima.

Você tem idéia do que possa ser?
Att
Juliano Soares
julianopiedade@gmail.com

Anônimo disse...

Bha, show de bola o artigo. Funcinou certinho, mas para quem é usuário no delphi isso no JAVA é muito fraco.

Unknown disse...

Luciano, concordo contigo 100%... ainda está bem longe do que o Delphi oferece.

[]'s

Anônimo disse...

cade o codigo ??????????

Unknown disse...

Corrigi o link que estava quebrado, o código do exemplo já está disponível novamente. Obrigado pelo aviso.

[]'s

Danilo disse...

Boa Tarde!

Artigo excelente! Funcionou certinho!

Obrigado!

Danilo

Sandro Rogério - Peggasus disse...

Haff !! , que trabalheira ..., A única razão de eu ainda não ter trocado o delphi pelo java ou por outra linguagem que eu possa trabalhar em várias plataformas é a falta de uma IDE de verdade.
Vamos combinar, que a linguagem JAVA faz oque se propõe a fazer, mas quando a produtividade está em palta, não tem pra ninguém, Delphi está no topo da lista.
Usando Delphi, eu faço a herança visual sem digitar um aúnica linha de código, e eu tenho acesso a todos as componentes do formulário "pai" sem stress nenhum .Agora imagina a repetição do processo de herança em um projeto com dezenas de formulários !!
Aff, já cancei só de pensar !!
Será que meu cliente vai gostar do prazo que eu pedirei a ele ???

AgIlIzA disse...

Eu gostaria de colocar um tabbedpanne
com 1 panel em cada
e passar os dois panels para serem implementados...
como posso fazer isso, pq na aba 1 seria o cadastro e na aba 2 a busca, os filtros seriam implementados para a aba 2 no jpanel2 e o cadastro na aba 1 pro jpanel1