.setVisible Dinamico [Quase Resolvido]

10 respostas
C

Bom, tenho uma classe que faz um select e armazena os valores obtidos em String resultando nisso:

String tipo = "JMenuItem"
String classe = "Principal()"
String nome = "JMenuItem1"
String visivel= "sim"

Eu queria saber se é possivel de alguma forma utilizar estas strings para efetuar o mesmo que um:

new Principal().JMenuItem1.setVisible(true)"

Ja procurei sobre reflexão mas não consegui fazer funcionar :cry: . Alguma dica?

Muito obrigado.

10 Respostas

Java_Boy

Tá, mas essas classes existem certo?

Porque ai voce podia fazer assim:

String nomeClasse = "br.com.algumacoisa.Principal";

classeX = Class.forName(nomeClasse );

objetoClasseX = classeX .newInstance();

Sacou?

muriloazs

Se eu entendi direito, você quer montar um código java com Strings?

Não é possível, por que tudo isso vai ser compilado como uma “cadeia de caracteres” e não como código da linguagem.

Qual o problema inicial?

com certeza dá pra resolver de outra forma. :wink:

[atualizado]
Ou do jeito que o cara de cima fez.

L
Object obj = Class.forName("pacote.Principal").newInstance();
obj.getClass().getMethod("setVisible",Boolean.class).invoke(obj, new Object[]{true});
L

nao esquecer do bloco TRY CATCH

E

Objetos não têm nomes (surpreso com isso), mas variáveis, classes e métodos têm. Portanto, você pode acessar uma variável, classe ou método através de reflection (ou seja, por nome). Um objeto não tem nome.

L

perdao… esqueci da field JMenuItem1… ok…

entao:

Object obj = Class.forName("pacote.Principal").newInstance();
Object objMenu = obj.getClass().getField("JMenuItem1").get(obj);
objMenu.getClass().getMethod("setVisible",Boolean.class).invoke(objMenu, new Object[]{true});

Importante: JMenuItem1 deve ser publico

C
O Pessoal é rápido aqui heim!! Muito obrigado pelas respostas! lauronolasco Tentei o seu código conforme o que tem aqui e ficou assim:
public static void test() throws InstantiationException, IllegalAccessException, NoSuchFieldException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {

       Object obj;
        try {
          obj = Class.forName("HotSpot.Login").newInstance();
          Object objMenu = obj.getClass().getField("conectar_botao").get(obj);
          [b]System.out.println(objMenu.toString());[/b]
          objMenu.getClass().getMethod("setVisible",Boolean.class).invoke(objMenu, new Object[]{false});

        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }

Resultado:

run:
javax.swing.JButton[,179,78,92x24,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.synth.SynthBorder...
Exception in thread "main" java.lang.NoSuchMethodException: javax.swing.JButton.setVisible(java.lang.Boolean)
        at java.lang.Class.getMethod(Class.java:1605)
        at HotSpot.Test.aiai(Test.java:32)
        at HotSpot.Test.main(Test.java:19)

Ao que indica ta encontrando o botão corretamente.
O que eu fiz de errado? :roll:

lauronolasco e pessoal muito obrigado!

E

Olhando a documentação de setVisible, você vê que ele precisa de um boolean (primitivo), não um java.lang.Boolean (objeto). http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#setVisible(boolean)

Portanto, você deve chamar getMethod com “boolean.class”, não “Boolean.class”.

C

entanglement:
Olhando a documentação de setVisible, você vê que ele precisa de um boolean (primitivo), não um java.lang.Boolean (objeto). http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#setVisible(boolean)

Portanto, você deve chamar getMethod com “boolean.class”, não “Boolean.class”.

Perfeito!
[size=18]
Muito Obrigado a todos! Valew mesmo!
[/size] :wink:

C

Eu tenho um Classe com JFrame chamado "Principal" e nele há um menu e alguns botões.

Tenho uma consulta sql que retorna em string as variáveis dos botoes e itens de menu e se o objeto deve ser mostrado ou escondido.

Por isso solicitei uma maneira de usar um setvisible dinamico mas estou com dificuldades.

O que está ocorrendo é que o método abaixo que está em outra classe(Checavisivel) não está setando a propriedade no objeto da classe indicada(Principal).

public static void SetaVisivel() throws InstantiationException, IllegalAccessException, NoSuchFieldException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {

       Object obj;
        try {

          obj = Class.forName("pacote.Principal").newInstance();
          Object objMenu = obj.getClass().getField("jButton_1").get(obj);
          objMenu.getClass().getMethod("setVisible", boolean.class).invoke(objMenu, new Object[]{false});

        } catch (ClassNotFoundException ex) {
            Logger.getLogger(SetaVisivel.class.getName()).log(Level.SEVERE, null, ex);
        }

Alguem consegue identificar o meu erro/burrice?

Muito Obrigado a todos!

Criado 4 de março de 2010
Ultima resposta 9 de mar. de 2010
Respostas 10
Participantes 5