Usando metodos e objetos de uma classe em outra

4 respostas
lucasjota

Galera estou agarrado aqui, já procurei no fórum e no google mas não consegui encontrar uma resposta.

Eu tenho duas classes que montam duas janelas no java. Basicamente o que eu quero é o seguinte:

1- na primeira janela (InterfaceAgenda), vc clica em “Novo” pra adcionar um item
2- Ao clicar em “Novo”, ele vai abrir uma segunda janela (InterfaceCriador), que tem os campos pro usuario preencher e instanciar um objeto da classe Compromisso.
3- Ao clicar no botão OK, a janela da classe InterfaceCriador fecha, e ele adciona um item ao atributo listaEventos da classe InterfaceAgenda

é justamente nesse ultimo passo que estou com problemas, pois não consigo acessas os métodos e atributos da classe InterfaceAgenda de dentro da classe InterfaceCriador. Já tentei:
*Criar um método na InterfaceAgenda que adcione um item na listaEventos, e depois acessar esse metodo na InterfaceCriador
*Fazer a classe InterfaceCriador extender a InterfaceAgenda, e o codigo InterfaceAgenda.listaEventos.add(titulo.getText());
*Passar a instância de Compromisso que acabei de criar pra classe InterfaceAgenda, pra assim poder adcionar o item.

Se alguém puder ajudar… abaixo seguem as duas classes:

import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class InterfaceAgenda extends JFrame{
	
	protected JButton btnDia, btnMes, btnAno, btnNovo, btnEditar, btnRemover;
	protected JLabel lblVisualizacao;
	public static List listaEventos;
	
	public InterfaceAgenda(){
		btnDia = new JButton("dia");
		btnMes = new JButton("mes");
		btnAno = new JButton("ano");
		lblVisualizacao = new JLabel("Visualizar:");
		btnNovo = new JButton("Novo");
		btnEditar = new JButton("Editar");
		btnRemover = new JButton("Remover");
		
		listaEventos = new List();
		
		Container c = this.getContentPane();
		c.setLayout(new GridBagLayout());
		c.add(lblVisualizacao);
		c.add(btnDia);
		c.add(btnMes);
		c.add(btnAno);
		c.add(btnNovo);
		c.add(btnEditar);
		c.add(btnRemover);
		c.add(listaEventos);
		
		OuvinteManipulaObj ouvinte = new OuvinteManipulaObj();
		btnNovo.addActionListener(ouvinte);
		btnEditar.addActionListener(ouvinte);
		btnRemover.addActionListener(ouvinte);
		
		btnEditar.setEnabled(false);
		btnRemover.setEnabled(false);
		
		this.setSize(400, 400);
	}
	
	public class OuvinteManipulaObj implements ActionListener{
		public void actionPerformed(ActionEvent e){
			if(e.getSource()== btnNovo){
				criaEvento();
			}else if(e.getSource()== btnEditar){
				JOptionPane.showMessageDialog(null, "edita");
			}else if(e.getSource()==btnRemover){
				JOptionPane.showMessageDialog(null, "remove");
			}
		}
	}
	
	public void criaEvento(){
		InterfaceCriador novo = new InterfaceCriador();
		novo.CriaCompromisso();
		novo.setVisible(true);
	}
	
	public static void addItemLista(String i){
		listaEventos.add(i);
	}

}
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class InterfaceCriador extends JFrame{
	
	public int tipoEvento = 0; //1=compromisso, 2=Tarefa, 3=aniversario
	
	public void CriaCompromisso(){
		final JTextField dataIni, horaIni, dataFim, horaFim, titulo, descricao, periodo;
		final JLabel lblDataIni, lblDataFim, lblHoraIni, lblHoraFim, lblTitulo, lblDescricao, lblRepetir, lblDiaInteiro, lblPeriodo;
		final JButton btnOk, btnCancelar;
		final JCheckBox repetir, diaInteiro;
		
		tipoEvento = 1;
		
		dataIni = new JTextField(50);
		horaIni = new JTextField(50);
		dataFim = new JTextField(50);
		horaFim = new JTextField(50);
		titulo = new JTextField(50);
		descricao = new JTextField(50);
		repetir = new JCheckBox();
		periodo = new JTextField(50);
		diaInteiro = new JCheckBox();
		btnOk = new JButton("OK");
		btnCancelar = new JButton("Cancelar");
		
		lblDataIni = new JLabel("Data de início:");
		lblDataFim = new JLabel("Data de término:");
		lblHoraIni = new JLabel("Hora de início:");
		lblHoraFim = new JLabel("Hora de término:");
		lblTitulo = new JLabel("Título:");
		lblDescricao = new JLabel("Descrição:");
		lblRepetir = new JLabel("Repetir?");
		lblPeriodo = new JLabel("Período de repetição:");
		lblDiaInteiro = new JLabel("Dia inteiro?");
		
		Container c = this.getContentPane();
		c.setLayout(new GridLayout(10,2));
		
		c.add(lblTitulo);
		c.add(titulo);
		c.add(lblDescricao);
		c.add(descricao);
		c.add(lblDataIni);
		c.add(dataIni);
		c.add(lblHoraIni);
		c.add(horaIni);
		c.add(lblDataFim);
		c.add(dataFim);
		c.add(lblHoraFim);
		c.add(horaFim);
		c.add(lblRepetir);
		c.add(repetir);
		c.add(lblPeriodo);
		c.add(periodo);
		c.add(lblDiaInteiro);
		c.add(diaInteiro);
		c.add(btnOk);
		c.add(btnCancelar);
		
		lblPeriodo.setEnabled(false);
		periodo.setEnabled(false);
		
		this.setSize(300, 300);
		
		btnOk.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				Compromisso c = new Compromisso(dataIni.getText(), dataFim.getText(),
						horaIni.getText(), horaFim.getText(), titulo.getText(),
						descricao.getText(), repetir.isSelected(), periodo.getText(),
						diaInteiro.isSelected());
				
				btnOk.getTopLevelAncestor().hide();
			}
		});
		
		btnCancelar.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				btnCancelar.getTopLevelAncestor().hide();
			}
		});
		
	}
	
	

}

4 Respostas

ViniGodoy

Crie a interfaceCriador como um JDialog e defina ela como modal. Aí sua janela de trás irá pacientemente esperar que a janela da frente feche, para executar qualquer código que venha após o setVisible(true).

Exemplo:
http://www.guj.com.br/posts/list/55710.java#292687

lucasjota

opa Obrigado!

Vou tentar fazer isso… Me pareceu um pouco complexo, pensei que tinha uma forma mais simples de fazer…

se der certo volto aqui avisando, thanks!

lucasjota

Olha, essa forma de fazer que vc sugeriu ta meio complicada, não sei tanto de java assim…

to tentando fazer com que o metodo criaCompromisso da classe InterfaceCriador retorne uma string. Deu certo com algumas ressalvas:
1- tive que colocar um InputDialog pra digitar a string que quero retornar, pois simplesmente fazer um return titulo.getText(); estava retornando uma string vazia
2- se abrir a janela pra criar um compromisso e depois cancelar, o titulo do compromisso continua na lista de eventos.

ViniGodoy

Estava retornando a String vazia pq a janela não era modal. O JFrame retorna então imediatamente após ser aberto, não fica parado no setVisible.

É uma péssima idéia tentar comunicar dois dois JFrames. É muitíssimo mais complicado que a solução que eu apresentei. Ao invés de abrir o código e se apavorar, leia ele devagar, e poste as dúvidas. Ignore os componentes que estão lá, e concentre-se apenas nas partes que deixei comentadas, que explicam como a comunicação funciona.

Criado 12 de dezembro de 2010
Ultima resposta 12 de dez. de 2010
Respostas 4
Participantes 2