Troca de parâmteros entre duas classes

7 respostas
O

Srs. e Sras.

Possuo duas classes distintas, na 1ª classe tenho um botão, neste botão adicionei um ActionListener e dentro executo um método selecionaRegistro(), no método instâncio outra classe passando dois parâmetros;

private void selecionaRegistro(ActionEvent e){
   
    Lista_Generica lista_generica = new Lista_Generica("Lista de Supervisores - Ativos", "Supervisor");
    lista_generica.setVisible(true);
}

Na 2ª classe recebo o título do JFrame e o nome da classe (dois parâmetros) para que possa fazer a busca nos registros no banco e adicioná-los em um JTable. Feito isto tenho um botão (Seleciona) que quando acionado pega os valores da linha selecionada e são repassadas para dois atributos públicos. Gostaria de passar estes dois atributos públicos para a 1ª classe a qual instânciou a 2ª.
Se eu pudesse saber na 2ª classe quem a instânciou poderia criar dois atributos públicos na 1ª classe e setá-los com os valores em tempo de execução (mas não sei se isso é possível ou mesmo viável).
Tentei no método selecionaRegistro (1ª classe) alguma maneira de obter estes valores da 2ª classe mas sem sucesso, pois dependo da execução do JButton (ActionListener) e não sei como interceptar este evento de dentro do método selecionaRegistro() da 1ª classe.

Alguma idéia de como implementar ?

Abraços

Olavo Jr.

7 Respostas

rmendes08

Cara, eu li umas 3 vezes e não entendi. Seguinte, para trocar parâmetros entre dois objetos ( e não entre classes ) basta você usar a passagem de parâmetros através dos métodos, ou então atribuir diretamente se o atributo for público (o que não é muito, aliás, nada recomendável). Eu achei a sua lógica e o seu texto um pouco confuso. Dê nome aos bois, diga o que é a primeira classe, o que á segunda classe, quais são esses atributos, etc … Se você postar um pouco mais do seu código ajuda também. Ah, mas faça isso usando as tags ['code], para você formatá-lo, dessa maneira eles ficam assim:

public class OlaGUJ{
   public void digaOla(){
       System.out.println( "Olá GUJ" );
   }
}
O

Bom se não ficou claro, vamos tentar esclarecer…

Na primeira classe tenho um cadastro de supervisores. Uma classe que estende o JFrame. Nesta classe tenho um JButton (Alterar) que desejo que quando acioná-lo ele instancie a segunda classe (está passando dois parâmetros String com o título e o nome da classe)… até aqui esta tudo funcionando a contento.

// Implementação ações no botão Alterar.
		jb3.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				selecionaRegistro(e);
			}});


	// Implementação do evento selecionaRegistro.
	private void selecionaRegistro(ActionEvent e){
		
		Lista_Generica lista_generica = new Lista_Generica("Lista de Supervisores - Ativos", "Supervisor");
		lista_generica.setVisible(true);
 
            // poderia ser aqui alguma forma de obter o retorno da segunda classe ?

	}

Na segunda classe tenho uma classe que é genérica usada para listar os dados dos cadastros, também estende o JFrame, possui um JTable usando um JScrollPane. No método construtor ela recebe os dois parâmetros que serão usados para o título do JFrame e o outro será utilizado para diferenciar a tabela na hora de gerar a SQL para popular o JTable. Aqui possuo um JButton (Selecionar) que seta os valores da linha em dois atributos públicos. (funcionando normalmente…)

// Método Construtor.	
	@SuppressWarnings("unchecked")
	public Lista_Generica(String titulo, String nome_classe){
	

		// Implementação do JButton - Selecionar
		jb1.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				linha = jtb1.getSelectedRow();
				
				if (linha < 0)
					JOptionPane.showMessageDialog(null, "Não há linha selecionada !");
				else
				{
					if (jtb1.getValueAt(linha, 0) == null)
						JOptionPane.showMessageDialog(null, "Selecione uma linha com dados !");
					else
					{
						codigo = String.valueOf(jtb1.getValueAt(linha, 0));
						descricao = String.valueOf(jtb1.getValueAt(linha, 1));
						minimizaLista();
					}
				}
			}
		});

O que não estou conseguindo fazer:

Preciso passar o registro (linha) selecionada no JTable da segunda classe para a primeira classe que foi a que a instânciou.

Por ser novato nesta linguagem não sei se é possível fazer esta troca de “parâmetros” (não sei se o termo é este) entre classes, tanto enviando como recebendo o retorno.

Estou usando o Eclipse 3.4.1 - Ganimed.

Ps. A troca de mensagens e parâmetros entre métodos sei que é perfeitamente possível de se executar.

Abraços

Olavo Jr.

rmendes08

O problema é o seguinte, a única referência que você tem do objeto Lista_generica que você cria é local ao método que trata o evento, assim, quando o método termina de executar você não consegue mais acessar esse objeto. Tente fazer assim:

class SuaClasseQueVoceNaoColocouONome{
   private Lista_Generica lista_generica;

   private void selecionaRegistro(ActionEvent e){  

      lista_generica = new Lista_Generica("Lista de Supervisores - Ativos", "Supervisor");  
      lista_generica.setVisible(true);  
   
      //aqui vc le os atributos da sua classe
      int c = lista_generica.codigo;
      String d = lista_generica.descricao;
  } 
}
rmendes08

Agora vamos à parte 2!

Bem, você disse que está começando com Java. É normal ter muitas dúvidas. O que eu não achei muito normal é alguém que está começando cair de ponta em interface gráfica , banco de dados , etc …

Por um acaso você é programador VB ou Delphi ?
Nada contra, absolutamente. Mas de repente aí esta a sua dificuldade. VB e Delphi tem a linguagem “chumbada” na IDE. Assim, fazer um aplicativo nessas ferramentas é desenhar a interface, dois cliques nos botões e escrever as rotinas. Precisa acessar o banco ? Ok, coloque um componente na tela e configure-o, que tá pronto.

Em Java o buraco é um pouco mais embaixo … Você vai ver que existem n IDEs para Java, n frameworks de interface , n frameworks de acesso à banco de dados, etc …, etc … E cada uma delas pode ter métodos e configurações completamente diferentes. Sendo assim, tentar aprender todas elas é no mínimo loucura.

Minha sugestão, comece com aplicações bem simples, apenas no console de comando, isso vai te dispensar de muitos detalhes de interface quase que irrelevantes.
Mas pra aprender Java, você vai precisar entender muito bem Programação Orientada a Objetos. Concentre-se em aprender o que é uma classe, o que é um objeto, herança, interfaces, etc … E o que eu acho essencial: aprender a diferença entre variáveis de tipos primitivos e variáveis de referência, sem isso não dá mesmo.

Abs

O

Obrigado por continuar a tentar me ajudar rmendes08,

Com relação ao seu código enviado na penúltima mensagem, sei que é possível acessar os atributos públicos da forma como você demonstrou:
#      //aqui vc le os atributos da sua classe  
#       int c = lista_generica.codigo;  
#       String d = lista_generica.descricao;
Mas para um ambiente de desenvolvimento OOP não é boa prática conter atributos públicos (fere um dos fundamentos da orientação a objeto - encapsulamento). Mesmo ferindo o nosso colega "encapsulamento" esta solução não me atende pois [b]dependo [/b]da seleção do registro na classe 2, para que  sim [b]depois [/b]possa pegar os valores dos atributos públicos,  devidamente populados.

O que não consigo é identificar [b]quando [/b]o registro foi selecionado na Lista_Generica (classe 2), para poder estartar o processo (retorno dos valores dos atributos públicos) na classe 1.

Estou tendo a ajuda de um colega de uma outra lista que me  duas soluções, ainda não parei para estudá-las, veja:


"Você pode declarar, na classe 2, um atributo do tipo da classe 1, e passar este atributo em um construtor ou em uma chamada separada a um "setter". Isto, ainda que você use uma interface, tem a desvantagem de acoplar as classes, determinando que uma classe 2 só funcione direito se acoplada a uma classe 1 (ou a uma interface específica, que a classe 1 implemente). Pode ser um problema ou não, dependendo de seus requisitos para reutilização da classe 2, mas é um pouco mais simples de implementar.

Outra opção, mais geral, é tornar a classe 1 um "property change listener" e incluir, em classe 2, uma propriedade do tipo PropertyChangeSupport. Assim, classe 1 pode "se inscrever" como um ouvinte para eventos de mudança de propriedade em classe 2, e classe 2 pode executar "firePropertyChange", avisando seus ouvintes sobre qualquer mudança. Pessoalmente, eu prefiro esta opção, pois não acopla as classes de uma forma "proprietária"."

Com relação a sua pergunta "Por um acaso você é programador VB ou Delphi ? ", não tenho experiência em nenhuma destas linguagens, embora  tenha "brincado" com o Delphi na Faculdade. Tenho boa experiência na linguagem/banco de dados Dataflex desde 1993, passando pelas versões character, procedural e oop (ambiente character e visual) e é meu ganha pão até hoje. 

Depois de muita reflexão resolvi abraçar uma nova linguagem a qual está em sintonia com o mercado atual, decidi-me por Java e banco Postgresql e estou desenvolvendo um sistema de Controle de Pesquisa de Opinião (ambiente cliente/servidor ou seja desktop) como um primeiro projeto. 

Tenho tido pouco tempo para estudar esta linguagem (pois levo-a paralelamente a outra linguagem), tenho relembrado conceitos de polimorfismo, herança, encapsulamento, mapeamento objeto relacional, relacionamentos, visibilidade, multiplicidade, escopo,  os diagramas de UML, arquitetura de software, entre outros, enfim tentando juntar tudo com o Java.

Estou bem "enferrujado" em OOP, pois quando se esta usando uma linguagem a tanto tempo, chega-se um momento em que não se busca mais a "melhor solução" e sim "resolve-se o problema", infelizmente,  pois tempo é dinheiro, mas enfim, devagarinho vou aqui "sofrendo" com estes processos iniciais, mais não  outra forma de se aprender se não for na prática e  que estou praticando prefiro fazer algo que  me forneça um retorno econômico...(isto responde o seu comentário "O que eu não achei muito normal é alguém que está começando cair de ponta em interface gráfica , banco de dados , etc ...

").

E por fim já passei por épocas em que escrevia o código todo, sem nem mesmo se utilizar de framework, apenas do compilador, então, não me assusta no Java escrever bastante código, até prefiro assim pois sempre sei "onde estou" e "o que estou fazendo", por isso escolhi o IDE Eclipse em vez do Netbeans.

É isso aí colega, vou aqui tentando e se por acaso tiver mais alguma sugestão, vamos discuti-la...

Abraços

Olavo Jr.

rmendes08

Certo … eu não tinha entendido que os valores deveriam ser passados na seleção da linha. Realmente, a melhor maneira de se fazer isso é registrar a classe 1 como listener da mudança da linha. Espero que não tenha me levado a mal sobre indagar sobre sua experiência. É que o estilo de programação de VB mistura lógica de apresentação com regras de negócio, e funciona. Mas Java é um pouco mais complicado nesse aspecto.
Bem, como você já tem alguma experiência, e você quer realmente desenvolver um produto, a minha sugestão é que você estude o padrão MVC de projeto. Assim você separa a sua interface da sua regra de negócio, e fica melhor pra você estender sua aplicação.

O

Não se preocupe rmendes08, não me senti ofendido pelo seu questionamento sobre minha experiência. Você foi o único aqui nesta lista que se dispôs a tentar me ajudar e sou-lhe grato por isso.
Hoje com o tempo que me é permitido consegui fazer o que pretendia usando a segunda dica que lhe descrevi no e-mail anterior (implementando PropertyChangeListener), enviado por um colega de uma outra lista.

Mais uma vez fico agradecido a você por tentar me ajudar, e espero poder contar com suas experiências no decorrer do desenvolvimento deste projeto.

Abraços

Olavo Jr.

Criado 29 de outubro de 2008
Ultima resposta 3 de nov. de 2008
Respostas 7
Participantes 2