Como envocar um método de outra classe?

7 respostas
J

Pessoal, sou novo por aqui e já estou com uma dúvida!
Peguei um exemplo de um livro e tentei separar as classes, mas nisso eu tenho que chamar um método de uma outra classe, mas não estou conseguindo. Estou colocando o código aqui pra quem puder me ajudar dar uma olhada. No livro a segunda classe está dentro da primeira, e assim o programa roda que é uma beleza! Eu até consegui resolver de outra maneira, mas gostaria de saber o que está falando nesse caso, mantendo como está o código o máximo possível. O erro está na chamada do método “mostrarTelaPrincipal()” da segunda classe, mais exatamente de dentro do ActionListener. Tentei referenciar por uma instância da 1ª classe, pela própria 1ª classe, mas não consegui. Como é que se faz, hein?

1ª classe:

package scltc;
import javax.swing.*;
import java.awt.*;

public class TelaPrincipal extends JFrame{
	TelaSplash splash;

	public TelaPrincipal(){
		super ("Está é a janela principal do aplicativo");
		
		Container tela = getContentPane();
		
		FlowLayout layout = new FlowLayout (FlowLayout.LEFT, 0, 0);
		tela.setLayout (layout);
		
		splash = new TelaSplash();
		splash.setVisible (true);
		
		setSize (400, 300);
		setLocationRelativeTo (null);
	}
	
	public void mostrarTelaPrincipal(){
		setVisible (true);
	}

	public static void main(String[] args) {
		TelaPrincipal aplicacao = new TelaPrincipal();
		aplicacao.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
	}
}

2ª classe:

package scltc;
import scltc.TelaPrincipal;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class TelaSplash extends JWindow{
	
	public TelaSplash(){
		Container tela = getContentPane();
		tela.setLayout (new FlowLayout(FlowLayout.LEFT, 1, 1));
		ImageIcon imagem = new ImageIcon ("imagens/tela_splash.jpg");
		JLabel rotulo = new JLabel (imagem);
		tela.add (rotulo);
			
		ActionListener fechar = new ActionListener(){
			public void actionPerformed (ActionEvent e){
				setVisible (false);
				dispose();
				mostrarTelaPrincipal();
			}
		};

		javax.swing.Timer timer = new javax.swing.Timer (5000, fechar);
		timer.start();
			
		pack();
		setLocationRelativeTo (null);
	}	
}

Desde já muito obrigado pela atenção galera,

Abraços…

7 Respostas

R

falta a chamada da classe

TelaPrincipal tl=new TelaPrincipal(); tl.mostrarTelaPrincipal();

espero q ti ajude

N

Olá amigo!

Não seiu se é bem isso que vc precisa…ou se já tentou.
Mas vc deve declarar que seu metodo é static para fazer uma chamada direta.

public void mostrarTelaPrincipal(){

setVisible (true);

}

troca por:

public static void mostrarTelaPrincipal(){

setVisible (true);

}

ou…
vc disse que já tentou criar uma instancia da classe TelaPrincipal
mas tente assim:

TelaPrincipal tl=new TelaPrincipal();

depois

tl.mostrarTelaPrincipal();

se der um erro na seguinte linha:
TelaPrincipal tl=new TelaPrincipal();

tire aquele Package scltc

um abraco.

F

Vc pode falzer isso de duas maneira:

1ª - instanciando um objeto da classe TelaPrincipal e chamando o método através da instancia.
2ª - declarar o método da classe TelaPrincipal como static pois dessa forma vc não precisará instanciar um objeto da classe para chamar o método.

J

Obrigado Ricardosis, nado e fcharpinel pela ajuda. Mas eu posso fazer mais perguntas sobre essas soluções que vcs colocaram?

Bom, eu estou usando o Eclipse, e ele já tinha me aconselhado a colocar o método “mostarTelaPrincipal” como static, porém quando eu faço isso ele me diz que o “setVisible()” que está dentro dele não é static.
Sobre a outra solução, eu até tinha pensando que quando eu criava “aplicacao” de dentro do MAIN, eu já tinha instanciado um objeto da classe TelaPrincipal para usar onde eu quiser, mas como eu não consigo fazer “aplicacao.mostrarTelaPrincipal” de dentro da classe “TelaSplash”, quer dizer que eu estou bem enganado, não é? Pq se eu instanciar novamente de denrto da classe TelaSplash pra logo depois chamar o “mostrarTelaPrincipal” como vcs colocaram, não pára de abrir telas de splash e do aplicativo. Tô fazendo algo errado ou é o caso de, por exemplo, tornar a classe “TelaSplash” um singleton?

Obrigado mais uma vez, valeu mesmo!

N
"jfrena":
Obrigado Ricardosis, nado e fcharpinel pela ajuda. Mas eu posso fazer mais perguntas sobre essas soluções que vcs colocaram?

Bom, eu estou usando o Eclipse, e ele já tinha me aconselhado a colocar o método "mostarTelaPrincipal" como static, porém quando eu faço isso ele me diz que o "setVisible()" que está dentro dele não é static.
Sobre a outra solução, eu até tinha pensando que quando eu criava "aplicacao" de dentro do MAIN, eu já tinha instanciado um objeto da classe TelaPrincipal para usar onde eu quiser, mas como eu não consigo fazer "aplicacao.mostrarTelaPrincipal" de dentro da classe "TelaSplash", quer dizer que eu estou bem enganado, não é? Pq se eu instanciar novamente de denrto da classe TelaSplash pra logo depois chamar o "mostrarTelaPrincipal" como vcs colocaram, não pára de abrir telas de splash e do aplicativo. Tô fazendo algo errado ou é o caso de, por exemplo, tornar a classe "TelaSplash" um singleton?

Obrigado mais uma vez, valeu mesmo!

Amigo quanto a ter que declarar que o setVisible é estatico naum tem problema pois "tudo" que esta em um metodo estatico deve ser estatico...
quanto ao abrir um monte de telas é o seguinte:
eu alterei o codigo... e coloquei metodo mostarTelaPrincipal no main entaum ela mostra a tela e fica esperando um evento do mouse ai eu coloquei um System.out.println só para vc ver que ele recebeu o evento
vai o codigo.

import javax.swing.*; 
import java.awt.*; 

public class TelaPrincipal extends JFrame{ 
   TelaSplash splash; 

   public TelaPrincipal(){ 
      super ("Está é a janela principal do aplicativo"); 
      Container tela = getContentPane(); 
      FlowLayout layout = new FlowLayout (FlowLayout.LEFT, 0, 0); 
      tela.setLayout (layout); 
      splash = new TelaSplash(); 
      splash.setVisible (true); 
      setSize (400, 300); 
      setLocationRelativeTo (null); 
   } 
    
   public void mostrarTelaPrincipal(){ 
      setVisible (true); 
   } 

   public static void main(String[] args) { 
      TelaPrincipal aplicacao = new TelaPrincipal(); 
      aplicacao.mostrarTelaPrincipal();
      aplicacao.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
   } 
} 


import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class TelaSplash extends JWindow{ 
    
   public TelaSplash(){ 
      Container tela = getContentPane(); 
      tela.setLayout (new FlowLayout(FlowLayout.LEFT, 1, 1)); 
      ImageIcon imagem = new ImageIcon ("imagens/tela_splash.jpg"); 
      JLabel rotulo = new JLabel (imagem); 
      tela.add (rotulo); 
          
      ActionListener fechar = new ActionListener(){ 
         public void actionPerformed (ActionEvent e){ 
            setVisible (false); 
            dispose(); 
            //mostrarTelaPrincipal(); 
            System.out.println("clicou");
         } 
      }; 

      javax.swing.Timer timer = new javax.swing.Timer (5000, fechar); 
      timer.start(); 
          
      pack(); 
      setLocationRelativeTo (null); 
   }    
}
J

Nado, acabou que eu dei uma olhada em alguns exemplos pra tela splash e acabei implementando a clase TelaSplash como singleton. Mas o seu código está bem mais simples, do jeito que eu queria!!! Obrigado pelas dicas, me ajudaram muito a corrigir alguns conceitos errados de minha parte quando a programação OO. Valeu mesmo mais uma vez!

Um grande abraço!

N

Muito bem, obrigado

Criado 10 de fevereiro de 2005
Ultima resposta 29 de mar. de 2005
Respostas 7
Participantes 5