Acessar o NOME QUE EU DEI ao componente (nome da variável)!

21 respostas
M

Bom dia pessoal !!

Por favor, quem puder me ajurar !!! Já pesquisei aqui no GUJ e em outros lugares, mas ainda sem sucesso.

Preciso simplesmente acessar em run-time programaticamente, o nome que eu dei ao componente. Não é o tipo nem o nome da classe, mas aquele nome que a gente dá quando vc clica com o botão direito do mouse sobre o componente e escolhe a opção “Alterar o nome da variável …”, no NetBeans 6.9.

Por exemplo: Eu adiciono um componente do tipo “JTextField”(javax.Swing.JTextField) em meu frame. Daí ele cria um componente de nome “JTextField34”, por exemplo. Daí eu altero o nome dele para “JTxtDescricao”. Depois, dentro de um método, por exemplo, preciso percorrer, através de um “for”, todos os componentes do meu frame pegando o nome deles.

Espero ter sido claro.

Se alguém puder me ajudar, ficarei imensamente grato.

Abraço a todos.

21 Respostas

Marck

Olá!

Testa ai

for(Component comp : frame.getComponents())
{
      if(comp instanceof JTextField)
     {
           ((comp)JTextField).getName();
     }
}

abraço

E

O nome da variável não é preservado em tempo de execução.

Entretanto, você pode manualmente atribuir um nome a cada componente (chamando “setName” desse componente com o nome desejado - pode ser qualquer coisa) e então, como fez o Marck, pegar os nomes com getName().

M

Bom dia Marck !!

Muitíssimo obrigado pela atenção e ajuda, mas infelizmente ainda não é isto. Isto eu já havia tentado. Ocorre que “.getName” traz o valor da propriedade “Name” do componente, que nada mais é do que uma variável vinculada ao componente e que você pode atribuir qualquer valor que desejar, tanto que o valor default dela quando o componente é adicionado ao frame, é “null”.

Abraço.

Marck:
Olá!

Testa ai

for(Component comp : frame.getComponents())
{
      if(comp instanceof JTextField)
     {
           ((comp)JTextField).getName();
     }
}

abraço

M

Bom dia amigo !!

Muito obrigado pela dica !!

Mas e se eu precisar utilizar a propriedade “Name” para um outro fim, que é o meu caso ? E é no mínimo estranho que o nome da variável seja armazenado em algum lugar e depois vc não tenha acesso a ele. Imaginei que, se vc consegue editar este nome, se ele aparece na janela de propriedades do componente e na janela “Inspetor”, vc poderia recuperar este nome de alguma forma.

Abraço !!

entanglement:
O nome da variável não é preservado em tempo de execução.

Entretanto, você pode manualmente atribuir um nome a cada componente (chamando “setName” desse componente com o nome desejado - pode ser qualquer coisa) e então, como fez o Marck, pegar os nomes com getName().

pmlm

Não podes aceder ao nome que dás à variável porque isso não faz sentido.

Imagina o seguinte código:

String a = "xpto";
String b = a;
String c = a;
String d = c;

Qual seria o nome dessa variável? Terias um objecto com quatro nomes diferentes…

E

Nomes de variáveis de instância de uma classe podem ser obtidas via reflection, se você quer saber. Basta obter o objeto java.lang.Class referente à classe do JFrame ou JPanel ou JDialog onde você declarou esses O problema, é claro, é você interpretar essa informação.

M

Com certeza, o difícil será interpretar isto. Cara mas valeu muito, pq já é um caminho. Vou pesquisar.

Obrigado e abraço.

pmlm

Não me parece que seja isso o pretendido aqui.

Marck

pmlm:
Não podes aceder ao nome que dás à variável porque isso não faz sentido.

Imagina o seguinte código:

String a = "xpto";
String b = a;
String c = a;
String d = c;

Qual seria o nome dessa variável? Terias um objecto com quatro nomes diferentes…

Nisso ai voce está falando de conteúdo. b = a…c=a vai passar o valor, e sempre voce terá as propriedades no objeto(a, b, c, d).
Com Reflection ele traz sim o nome da variável.

Exemplo

....
obj.getClass().getDeclaredFields()[0].getName();

Abraço!

M

Você tem razão Marck. Estive pesquisando e caminho é este mesmo, através de Reflection. Estou testando algo neste momento …

Marck:
pmlm:
Não podes aceder ao nome que dás à variável porque isso não faz sentido.

Imagina o seguinte código:

String a = "xpto";
String b = a;
String c = a;
String d = c;

Qual seria o nome dessa variável? Terias um objecto com quatro nomes diferentes…

Nisso ai voce está falando de conteúdo. b = a…c=a vai passar o valor, e sempre voce terá as propriedades no objeto(a, b, c, d).
Com Reflection ele traz sim o nome da variável.

Exemplo

....
obj.getClass().getDeclaredFields()[0].getName();

Abraço!

M

Bom dia Marck !!!

Cara, vi que realmente o Reflection seria o caminho mesmo. Tentei alguma coisa aqui e ainda não deu certo.

Quando utilizo “obj.getClass().getDeclaredFields()[0].getName();” ele ainda não retorna o nome da variável de instância do objeto(“JTxtNome”, por exemplo), mas algo como “action”, “actionPropertyChangeListener”, “notifyAction”, “visibility”, etc.

Será que não estou utilizando corretamente ?

Pessoal, heeeeeeeeeelppppppp. Tá feia a coisa !!!

marcioiran:
Você tem razão Marck. Estive pesquisando e caminho é este mesmo, através de Reflection. Estou testando algo neste momento …

Marck:
pmlm:
Não podes aceder ao nome que dás à variável porque isso não faz sentido.

Imagina o seguinte código:

String a = "xpto";
String b = a;
String c = a;
String d = c;

Qual seria o nome dessa variável? Terias um objecto com quatro nomes diferentes…

Nisso ai voce está falando de conteúdo. b = a…c=a vai passar o valor, e sempre voce terá as propriedades no objeto(a, b, c, d).
Com Reflection ele traz sim o nome da variável.

Exemplo

....
obj.getClass().getDeclaredFields()[0].getName();

Abraço!

pmlm

Tal como eu já havia dito atrás, não consegues fazer o que pretendes.

O que estás a fazer é ir buscar as propriedades de JTextField, não o nome que tu dás ao teu objecto.

M

Boa tarde amigo pmlm,

Então você sabe como se faz.

Se puder me ajudar, ficaria extramemente grato.

Abraço.

pmlm:
Tal como eu já havia dito atrás, não consegues fazer o que pretendes.

O que estás a fazer é ir buscar as propriedades de JTextField, não o nome que tu dás ao teu objecto.

pmlm

O que tu queres fazer em concreto não dá para fazer.

Podes tentar dar a volta como já te foi sugerido atrás e usar o getName. Para não dar null, antes de adicionar o JTextField à frame fazes

JTxtDescricao.setName("JTxtDescricao");
M

Bom dia amigo,

Não quero utilizar a propriedade “Name”, pois tenho outros planos pra ela.

E há como recuperar a variável de instância sim, pois o NetBeans faz isto.

Estou tentando passar uma imagem do que realmente preciso, não sei se vai aparecer. Caso não apareça e alguém puder me explicar como incluir imagem a este post.

Obrigado.

pmlm:
O que tu queres fazer em concreto não dá para fazer.

Podes tentar dar a volta como já te foi sugerido atrás e usar o getName. Para não dar null, antes de adicionar o JTextField à frame fazes

JTxtDescricao.setName("JTxtDescricao");

Marck

Olá!

Por favor, põe o código do que você está fazendo.

M

Bom dia Marck,

Segue aí o código de um método simples, apenas para ilustrar o que preciso:

public static  boolean Encontrou_Objeto(Component[] components, String NomeObjeto)

{

// O parâmetro [components] recebeu, por exemplo, jPanel1.getComponents() de um JFrame de minha aplicação .

// O parâmetro [NomeObjeto] recebeu, por exemplo, o valor jTxtNome.
// Então a idéia é percorrer todos os componentes deste "jPanel e verificar
   // se existe algum, cujo valor da sua variável de instância seja igual a "jTxtNome".

   // ** - VEJA BEM, VALOR DA VARIÁVEL DE INSTÂNCIA(que pode ser alterada quando se clica com o botão
   //      direito do mouse sobre o componente e se escolhe a opção "Alterar o nome da variável ..." do NetBeans) 
   //      E NÃO VALOR DA PROPRIEDADE "Name", ENCONTRADA NA JANELA DE PROPRIEDADES DO OBJETO.

   boolean Resultado = false;

   for (Component c : components)
   {
       Class classe = c.getClass();
       Field[] campos = classe.getFields();

       for (int i = 0; i < campos.length; i++)
       {
           if (campos[i].getName().toUpperCase().equals(NomeObjeto.toUpperCase()))
           {
               // O problema é que o método ".getName()" traz uma informação que não tem nada a ver
               // com o valor da variável de instância do objeto.
               // E se levarmos em conta de que o NetBeans, por exemplo, traz esta informação em vários
               // lugares de sua IDE, como por exemplo, a janela "Inspetor", chegamos a conclusão de que
               // é possível sim, recuperar esta informação em run-time, de alguma forma. 
               Resultado = true;
               break;
           }
       }
   }

   return Resultado;

}

Tomara que vc me consiga me ajudar, pois já estou com as costas vermelhas, de tanto apanhar … rsrs …

Abraço amigo !!

Marck:
Olá!

Por favor, põe o código do que você está fazendo.

VictorMatuk

bem, eu faço assim

public class blabla extends JPanel implements ActionListener{ JTextField texto = new JTextField(); public blabla() { add(texto) } public void actionPerformed(ActionEvent e) { Object origem = e.getSouce(); if(origem == texto){ //faz coisas legais } } }

emanuelCruz

Creio que o que você quer é isso:

import javax.swing.JFrame;
import javax.swing.JTextField;


public class Tela extends JFrame{

	private static final long serialVersionUID = 1L;
	
	/** componentes da tela (nomes que quero testar)*/
	JTextField txtNome;
	JTextField txtTelefone;
	
	/** funcao que informa se encontrou um componente com um nome especifico*/
	public static boolean findComponentByName(Object tela, String name){
		Class<?> classe = tela.getClass();
		try {
			classe.getDeclaredField(name);
			return true;
		} catch (SecurityException e) {
		} catch (NoSuchFieldException e) {
		}
		return false;
	}
	
	/** teste !!! */
	public static void main(String[] args) {
		System.out.println( findComponentByName(new Tela(), "txtNome") );
		System.out.println( findComponentByName(new Tela(), "txtNomeErrado") );
		
	}
	

}

No exemplo ele encontra o primeiro componente pelo nome (txtNome) e imprime true, e não encontra o segundo (txtNomeErrado) e imprime false.

Marck

marcioiran:
Bom dia Marck,

Segue aí o código de um método simples, apenas para ilustrar o que preciso:

public static  boolean Encontrou_Objeto(Component[] components, String NomeObjeto)

{

// O parâmetro [components] recebeu, por exemplo, jPanel1.getComponents() de um JFrame de minha aplicação .

// O parâmetro [NomeObjeto] recebeu, por exemplo, o valor jTxtNome.
// Então a idéia é percorrer todos os componentes deste "jPanel e verificar
   // se existe algum, cujo valor da sua variável de instância seja igual a "jTxtNome".

   // ** - VEJA BEM, VALOR DA VARIÁVEL DE INSTÂNCIA(que pode ser alterada quando se clica com o botão
   //      direito do mouse sobre o componente e se escolhe a opção "Alterar o nome da variável ..." do NetBeans) 
   //      E NÃO VALOR DA PROPRIEDADE "Name", ENCONTRADA NA JANELA DE PROPRIEDADES DO OBJETO.

   boolean Resultado = false;

   for (Component c : components)
   {
       Class classe = c.getClass();
       Field[] campos = classe.getFields();

       for (int i = 0; i < campos.length; i++)
       {
           if (campos[i].getName().toUpperCase().equals(NomeObjeto.toUpperCase()))
           {
               // O problema é que o método ".getName()" traz uma informação que não tem nada a ver
               // com o valor da variável de instância do objeto.
               // E se levarmos em conta de que o NetBeans, por exemplo, traz esta informação em vários
               // lugares de sua IDE, como por exemplo, a janela "Inspetor", chegamos a conclusão de que
               // é possível sim, recuperar esta informação em run-time, de alguma forma. 
               Resultado = true;
               break;
           }
       }
   }

   return Resultado;

}

Tomara que vc me consiga me ajudar, pois já estou com as costas vermelhas, de tanto apanhar … rsrs …

Abraço amigo !!

Marck:
Olá!

Por favor, põe o código do que você está fazendo.

Olá!
Utilize o método getDeclaredField(name); como está no código do emanuelCruz.
Teste este código. Funciona!

T

E ai Rapaziada blz?
E se eu tenho o seguinte código:

public void inserirLabel() {   
    int cont2 = 0;  cont2++;   
    ImageIcon img = new ImageIcon("imagem.gif");   
    JLabel jt2 = new JLabel(img);   
    painel.add(jt2);   
    jt2.setText("imagem " + cont2);   
    GridLayout grid = new GridLayout(5, 3);   
    jt2.setVerticalTextPosition(JLabel.TOP);   
    jt2.setHorizontalTextPosition(JLabel.CENTER);   
    painel.setLayout(grid);     
}
JLabel jt = new JLabel(img);   
  painel.add(jt2);

Como que eu faço um for ou um if que altere esse nome do objeto jLable “jt” para uma seguencia "jt1 e o outro jt2 e jt3

Valeu!

Criado 30 de julho de 2010
Ultima resposta 23 de fev. de 2011
Respostas 21
Participantes 7