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.
[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();
}
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…
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?
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??!!
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…
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
}
}
[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();
}