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