[dúvida] Chamar método atravéz da instância?

se tenho duas classes, uma classe A e uma classe B.

se na classe A crio um objeto da classe B, como faço pra chamar um método da classe A?

exemplo:

[code]class A {

metodo1 {
B objeto = new B();
}

metodo2 {
//algoritmo
}

}[/code]

[code]class B {

public B() {
//COMO FAÇO PARA CHAMAR O METODO metodo2 DA CLASSE A?
}

}[/code]

quero fazer tipo os listener de botão, que quando o usuario aperta o botao, ele chama o metodo na minha classe para tratar…

obrigado

Pelo que entendi, só criando um objeto de A no método de B você teria acesso. Mas não sei se é o tipo de acesso que vc deseja. Os exemplos no livro do Deitel utilizam classes internas, mas é diferente do que vc está fazendo.

eu gostaria que vocês me dissecem o jeito correto para se fazer isso:

a [color=red]class A[/color] é a interface grafica, que possui um campo chamado cmp_msg e uma instancia da [color=blue]class B[/color]

e a [color=blue]class B[/color] é uma classe que tem um socket, que captura dados

eu quero que qnd a [color=blue]class B[/color] receber um comando pelo socket, chame um metodo da [color=red]class A[/color].

qual a maneira correta de se fazer isso?

[quote=kaumaukau]eu gostaria que vocês me dissecem o jeito correto para se fazer isso:

a [color=red]class A[/color] é a interface grafica, que possui um campo chamado cmp_msg e uma instancia da [color=blue]class B[/color]

e a [color=blue]class B[/color] é uma classe que tem um socket, que captura dados

eu quero que qnd a [color=blue]class B[/color] receber um comando pelo socket, chame um metodo da [color=red]class A[/color].

qual a maneira correta de se fazer isso?[/quote]
Cara para ter um relacionamento especial entre as classes nada melhor
que classes internas;

[code]
public class Externa{

void fazeralgo(boolean receb){
Interna i=new Interna();//aqui vc vai precisar instaciar!
i.evento();
}
public class Interna{//na classes interna vc pode chamar um metodo da classe externa!! sem precisar de instaciar!
void evento(){
System.out.println(“sou o evento!!”);
}
}
public static void main(String…a){
Externa exte=new Externa();
exte.fazeralgo(true);

}

}[/code]
Agora analizando bem sua dúvida fiz um exemplo que espero te ajude no
entendimento

public class A{//classe chamada tambem de encapsuladora,pois tem um relacionamento especial com a classe interna 
   boolean informacao;
   void fazeralgo(){
       System.out.println("Fazendo algo!!");
   }
        public class B{//os membros da classe interna podem ser chamados diretamente na classe interna
               void evento(){
                   if(informacao == true ){//
                    System.out.println("A classe Interna recebeu algo!!");
                    fazeralgo();//logo recebeu algo de A chama o metodo propriamente dito
                   }
               }          
           }
   public static void main(String...a){
   A exte=new A();
   
   
   }

:-o

Opa kaumaukau…blz…

Então a primeira coisa que eu faria era não usar essas letras "A", "B",…é dificil pensar em objetos sem nome.
Vou chamar temporariamente class A de JanelaComBotão e class B de Socket…rsrsrsrs

Nosso amigo felipemartinsss já respondeu…
Quando estamos em orientação a objeto só podemos usar um método de uma classe de duas formas:
estaticamente ou instanciando a classe. Exemplos:

class JanelaComBotão (A){

      public void getSocket() {
            //B objeto = new B();
            Socket socket = new Socket();
            socket.fazAlgo();//faz algo enunciado-> public (void) fazAlgo(){
      }

}
class JanelaComBotão (A){

      public void getSocket() {
            //B objeto = new B();
            Socket .fazAlgo();//faz algo enunciado-> public static (void) fazAlgo(){
      }

}

Mas não me parece ser essa sua pergunta…acho que vc quer saber como executar um comando numa janela que já está aberta em uma classe que não está vinculada a ela…
Se for isso vc vai precisar de uma terceira classe. Nela vc irá instanciar estaticamente a class JanelaComBotão (A) e poderá executar os comandos assim:

class Socket(B){

      public void setLabelJanelaComBotao() {
           terceiraClasse.fazAlgo();
           //método faz algo(); public (void) fazAlgo(){instânciaDeJanelaComBotao.fazAlgo();}
      }

}

Espero ter ajudado meu caro
Qualquer dúvida tamos ai…

[]'s

ainda não conseguir fazer =(

segue o codigo no qual eu gostaria de acessar o metodo de outra classe:

arquivo: janela.java

[code]class Janela {

public HABILITAR_BOTAO() {

}

public static void main(String[] args) {

MeuSocket = new MeuSocket();
Thread TMeuSocket = new Thread( MeuSocket );
TMeuSocket.start();

}

}[/code]

arquivo: MeuSocket.java

[code]class MeuSocket implements Runnable {

public void run() {

    while( true ) {

    dado = socket.receberDado();

        if( dado == "HABILITAR_BOTAO" ) {

            //PRECISO CHAMAR O METODO HABILITAR_BOTAO() QUE ESTA NA CLASSE JANELA, COMO FACO ISSO?

        }

    }

}

}[/code]

e aproveitando o topico, quais as diferecans entra criar classes em arquivos diferentes, no mesmo arquivo, ou uma externa e uma interna?

obrigado

Fala grande…

Então para sua última pergunta vou te passar alguns links pra vc estudar e tirar sua própria opinião.
Além do mais se estivesse explicando poderia apenas estar transcrevendo de onde li, então porque não passar logo a fonte??!!

http://www.inf.ufes.br/~vsouza/files/JavaBasico08.pdf
http://www.argonavis.com.br/cursos/java/j100/java_16.pdf

A princípio pra mim só é interessante utilizar classes internas quando for muito necessário, senão prefiro cada uma no seu arquivo, questão de gosto.

Para “//PRECISO CHAMAR O METODO HABILITAR_BOTAO() QUE ESTA NA CLASSE JANELA, COMO FACO ISSO?” preciso entender uma coisa, qual classe vai ser instanciada primeiro: MeuSocket ou Janela?? Como está o fluxo de execução da aplicação. Está confuso…tipo: já há uma instância da classe Janela quando for feito esse thread para MeuSocket??



import java.awt.Dimension;
import java.awt.Rectangle;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Janela{

	private JFrame jFrame = null;
	private JPanel jContentPane = null;
	private JButton jButton = null;

	public Janela(){
		getJFrame();
	}
	/**
	 * This method initializes jFrame	
	 * 	
	 * @return javax.swing.JFrame	
	 */
	private JFrame getJFrame() {
		if (jFrame == null) {
			jFrame = new JFrame();
			jFrame.setSize(new Dimension(293, 169));
			jFrame.setTitle("Janela");
			jFrame.setContentPane(getJContentPane());
		}
		return jFrame;
	}

	/**
	 * This method initializes jContentPane	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.add(getJButton(), null);
		}
		return jContentPane;
	}

	/**
	 * This method initializes jButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setBounds(new Rectangle(95, 60, 100, 33));
			jButton.setEnabled(false);
		}
		return jButton;
	}

	public void habilitarBotao() { 
		if(jButton.isEnabled())
			jButton.setEnabled(false);
		else
			jButton.setEnabled(true);
	} 
	
	public static void main(String[] args) {
	    
	    Janela janela = new Janela();
	    Thread TJanela = new Thread(janela);

	    TJanela.start();
	    
	    MeuSocket socket= new MeuSocket();
	    Thread TMeuSocket = new Thread(socket);

	    TMeuSocket.start();

	}
}

class MeuSocket implements Runnable {

	public void run() {
		boolean isHABILITAR_BOTAO = false;
		while( true ) {

			dado = socket.receberDado();

			if( dado == "HABILITAR_BOTAO" ) {

				setEnabledBotao();

			}
		}

	}

}

Usando classe interna…Parece ser a solução mais ágil para o seu caso
Mas ainda não sei se é isso que vc está querendo…

[]'s

Os listeners seguem um padrão: Observer

O objecto observável , no seu caso o socket, gera eventos. Os eventos são enviados a quem deles precisar.
Quem precisa do evento deve se registrar no observador.

O segredo é usar uma interface para os interessados no evento.


// produtor de eventos
class B {

Set listeners = new HashSet();
addBListener(BListener listener){
     listeners.add(listener);
}


public void metodo (){
// este método produz um evento
// e o distribui aos listeners

BEvent event = new BEvent(dados);

for (BListener b : listerners){
        b.onEvent(event);
}
}
}

// os interesados no evento devem implementar esta interface
interface BListener {

public void onEvent(BEvent event);

}

// se o objeto A está interesado ele implementa a interface e se regista

class A implements BListener{

 B b;
 metodo (){
   b = new B();
   b.addBListener(this);
 }

// método que será chamado quando o evento acontecer
 public void onEvent(BEvent event){
   // faz alguam coisa
 }
  
}
class B{
A objt = new A();
objt.metodo();
}
//chama o metodo da classe A.

flw!!

[quote=kaumaukau]se tenho duas classes, uma classe A e uma classe B.

se na classe A crio um objeto da classe B, como faço pra chamar um método da classe A?

exemplo:

[code]class A {

metodo1 {
B objeto = new B();
}

metodo2 {
//algoritmo
}

}[/code]

[code]class B {

public B() {
//COMO FAÇO PARA CHAMAR O METODO metodo2 DA CLASSE A?
}

}[/code]

quero fazer tipo os listener de botão, que quando o usuario aperta o botao, ele chama o metodo na minha classe para tratar…

obrigado[/quote]

Bom, tirando toda a programacao elegante mencionada nos topicos acima… outra forma de fazer o que você questionou (Pode ser que com seu amadurecimento você perceba que sua duvida seja outra na realidade) é a seguinte:

[code]Class A {

metodo1() {
B objeto = new B(this);
}

metodo2() {
//algoritmo
}

}

class B {

public B(A a) {
//COMO FAÇO PARA CHAMAR O METODO metodo2 DA CLASSE A?
a.metodo2();
}

}[/code]

Abraco.

conseguir fazer :slight_smile:

obrigado a todos