Como Intanciar Dinamicamente?

7 respostas
F

Olá pessoal.

Lá estou eu precisando de um help agora.
Seguinte, possuo uma classe que gerencia outras classes…

Exemplo:
:arrow: Controla a aplicação
Principal: GeradorDeInterfaces :: Tipo: JWindow
:arrow: Gerencia qual interface usará na aplicação
Intermediaria: Gerenciador :: Tipo: JPanel
:arrow: Possui todos os componentes de tela
Secundaria: TemplateInterface00 :: Tipo: JComponent
:arrow: Possui todos os componentes de tela
Secundaria: TemplateInterface01 :: Tipo: JComponent
:arrow: Possui todos os componentes de tela
Secundaria: TemplateInterface02 :: Tipo: JComponent
:arrow: Possui todos os componentes de tela
Secundaria: TemplateInterface03 :: Tipo: JComponent

Bem, a função da Classe Principal é de chama uma interface, no qual repassa a coordenada para a Classe Intermediaria que por sua vez instancia a Classe Secundaria de acordo com a instrução recebida, dessa forma tenho uma estrutura bastante flexível.

Tenho tido problemas no ponto que vou instanciar essa Classe Secundaria, não tenho tido sucesso na implementação.

Como conseguir este resultado na instância da Classe Secundaria feita da Classe Intermediaria de forma dinâmica?

painelRoot = new TemplateInterface00(this);

Como posso pegar o nome dessa Classe Secundaria e aplica este mesmo código em cima?

Já tentei pegar o nome da classe, mas como ela retorna do tipo String, não tenho tido sucesso. Preciso do tipo JComponent, visto que a Classe Secundaria é JComponent.

Se alguém tiver uma visão de como resolver isto, me esclareça, por favor.

Perdoi-me se não fui bem claro, qualquer coisa eu tento esclarecer melhor.

Abraço,
Fábio Heleno

7 Respostas

B

Olá, vc tem como saber qual Classe Secundaria vc irá instanciar? se souber, mesmo que dinamicamente vc pode usar o método newInstance(), da Class, mas neste caso vc tem que ter um construtor default.

F

Oi Bruno,

Assim, eu tenho uma classe no qual funciona como registro, nela eu puxo a interface atual me retornando o nome da classe, esse não seria o problema.

Já havia tentado fazer como você me falou…

Class classInterface = Class.forName("Cripto." + RegTelas.getNomeClasse(RegTelas.getTelaAtual()));

até aqui, tranquilo, problema que logo em seguida tenho que instancia-la da seguinte maneira:

painelRoot = new TemplateInterface00(this);

Para que todos os componentes desta classe sejam inseridos no meu panel (painelRoot).

A questão é esta:

  • Como pegar essa classInterface e usá-la para instancia-la como na forma citada acima no painelRoot ?

Tenho morrido na praia neste ponto! :sad:

Se tiver alguma outra maneira utilizando a Classe instanciada classInterface, até poderia ser, mas não tenho conseguido também.

Abraço,
Fábio Heleno

B

Olá Fabio, deixa ver se entendi, vc consegue pegar o “Class” em

Class classInterface = Class.forName("Cripto." + RegTelas.getNomeClasse(RegTelas.getTelaAtual()));

e quer instanciar este classInterface, jogando, adicionando em painelRoot?? se for tente assim:

Class classInterface = Class.forName("Cripto." + RegTelas.getNomeClasse(RegTelas.getTelaAtual()));

Panel painelRoot = (Panel) classInterface.newInstance();
F

Bruno,

é isso, só que com um porém, a de que ele deve repassar um parametros “this” para a próxima classe quando instanciada.

Estou exatamente ai. :cry:

Você tem alguma ideia de como proceder neste caso?

F

Em minha última tentativa conseguir "aparentimente" resolver o problema, mas o bixo é triste, persiste! :sad:

Olhem só:
String className = "Cripto.TemplateInterface00";

Class classInterface = Class.forName(className);

Constructor Construtor = classInterface .getConstructor(new Class[] {ModelsInferfacesTela00.class});

painelRoot = (JPanel) Construtor.newInstance(new Object[]{this});
[color="red"]Error
java.lang.NoSuchMethodException: Cripto.TemplateInterface00.<init>(Cripto.TemplateInterface00)
[/color] só reforçando: preciso de um resultador igual a este:
painelRoot = new TemplateInterface00(this);
dinamizando somente o nome da classe no qual chamo.

Aiiii minha cabeça!!!! :tosco:

B

OLá Fabio, foi mal a sumida, mas as paradas aqui no trampo estão confabulando contra mim…

mas seguinte, este erro dá pq o getConstructor não tá achando o construtor que vc quer.

F

em Bruno, você não tem uma idéia ai de como resolver isto? não o erro, mas o fato de conseguir de só instanciar a outra classe.

Porque o algoritmo é este:

  • Aplicação chama tela;
  • Classe intermediaria (a responsavel por controlar telas) instancia a classe no qual aplicação requisitou (classe secundaria);
  • Classe intermediaria possui somente o nome da classe que tem a interface, em string;
    [color=“red”]Problema está neste ponto abaixo[/color]
  • Aqui seria pegar essa string e instanciar, encapsulando assim a classe com os graficos na classe intermediaria. Neste passo deve repassar um parametro para a classe secundaria, pois quando retornar, ja vem pronto com todos os componentes(botoes,labels,etc…) contruidos em cima do parametro passado(JPanel);

:tosco:

Criado 26 de abril de 2005
Ultima resposta 27 de abr. de 2005
Respostas 7
Participantes 2