A quem se refere o this aqui

2 respostas
J

Tô botando um código e tenho algumas dúvidas sobre ele:

import javax.swing.JFrame;
import java.awt.Color;
import javax.swing.JButton;

public class Janela extends JFrame {
	private JButton btnOK ;
	public Janela() {
		
		//super("Janela Tela");
		this.setTitle("Janela Tela");
		this.getContentPane().setLayout(null);
		this.setSize(340,220); 

		this.setLocationRelativeTo(null);
		
		this.getContentPane().setBackground(Color.RED);	
		
		this.btnOK = new JButton("OK");
		btnOK.setBounds(100,100,55,25);
		
		this.getContentPane().add(btnOK);
		
	}

	public static void main(String[] args) {
		Janela j = new Janela();
		 
		j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		j.setVisible(true);
	}
}
Por que pode usar tanto o seTitle quanto o super?
//super("Janela Tela");
this.setTitle("Janela Tela");

Eu sei que esse this ai na frente não precisa pois está implicitamente, mas
ele se refere á quem, à JFrame. à Janela, ou quando ela é instanciada com JFrame J = new Janela(); ?

this.setTitle("Janela Tela");
O getContentPane() server para obter o painel que está a frente do JFrame?
this.getContentPane();
por que eu não posso adicionar um botão assim diretamente? Vamos supor que meu Layout seja outro qualquer...
//this.add(btnOK);
É padrão usar todos os componentes como privados(eu sei o que quer dizer private ), porquê?
private JLabel l1;
Já me disseram que os parâmetros que estão ai (JFrame.EXIT_ON_CLOSE) poderia ser um número, o EXIT_ON_CLOSE tem equivalência com algum número?
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Outra suposição, vamos supor que eu tenha esse código ai junto ao meu: Esse this como parâmetro se refere á quem?
this.btnOK = new JButton("OK");
this.btnOK.addActionListener(this);

Vamos supor que minha Janela esteja implementando um ActionListener,
essa ordem de hierarquia,pois Janela herda de JFrame e implementa ActionListener, quem é pai de quem?
Eu ouvi falar que o this se refere á superclasse,e ntão esses this se referem por exemplo á JFrame?

Esse código aí, entendi mais ou menos, só que: Esse (e) na frente do ActionEvent o que é e pra que server? Eu sei o que faz o getSource, mas teóricamente o que el faz? Porque foi usado a superclasse de todos aí e jogado o getSource nela?
public void actionPerformed(ActionEvent e){
		Object o =e.getSource();
		if (e.getSource().equals(btnOK)) {
			System.out.println("Chamou....: OK");
			new Janela().show();
		}
		else 
			if ( o.equals(btnCancel)){
			System.out.println("Chamou....: CANCEL");
			System.exit(0);
		}
	}

Eu acho que chega por enquanto! hehehe
Se alguém puder me ajudar, esses pequenos detalhes é que tá pegando.
Valeu!!!

2 Respostas

R

super é o construtor da classe, a função dele entre outras coisas é iniciar atributos de classe, no caso da jframe que sua classe herda ele inicia o titulo, provavelmente usando setTitle("…"), mas vc pode altera-lo após com essa função.

a palavra reservada this faz refeerencia a propria classe , quando usamos o this.atribuito estamos fazendo referencia ao atribuito da classe mas se usarmos por exemplo super.atributo nos referimos ao atributo da classe para que a classe filho herda.

por que eu não posso adicionar um botão assim diretamente?
não tenho certeza mas acho que soh se pode adicionar botoes e outros compomentes a um content

É padrão usar todos os componentes como privados(eu sei o que quer dizer private ), porquê?
padrão não é mas dizem que é uma boa pratica , pois uma das grandes vantagem da OO é o encapsulamento

S
Seguinte:
//super("Janela Tela"); 
this.setTitle("Janela Tela");
Dá uma olhada como é o construtor do JFrame (um dos construtores):
public JFrame(String title) throws HeadlessException {
        super(title);
        frameInit();
    }
Ele chama super(title). Olha o construtor do Frame:
public Frame(String title) throws HeadlessException {
        init(title, null);
    }
// Chamou init(), que é:
private void init(String title, GraphicsConfiguration gc) {
        this.title = title; // Aqui passou o título
        weakThis = new WeakReference(this);
        addToFrameList();
        SunToolkit.checkAndSetPolicy(this, false);
    }

No final das contas, atribuiu à variável title o valor da String.

No setTitle():
public void setTitle(String title) {
        String oldTitle = this.title;
        if (title == null) {
            title = "";
        }


        synchronized(this) {
            this.title = title; // Passou o título
            FramePeer peer = (FramePeer)this.peer;
            if (peer != null) {
                peer.setTitle(title);
            }
        }
        firePropertyChange("title", oldTitle, title);
    }

O this se refere ao próprio objeto da classe Janela. No caso, à variável j.

O getContentPane() server para obter o painel que está a frente do JFrame?
Ele retorna um objeto do tipo Container, que vai conter os outros componentes (botão, label, etc).
por que eu não posso adicionar um botão assim diretamente?
Você tem que adicionar no Container do JFrame. Por isso que o recupera com getContentPane() e depois chama o add(). Se achar menos chato, pode fazer assim:
Container c = getContentPane(); // ou this.getContentPane();
c.add(botao);
É padrão usar todos os componentes como privados(eu sei o que quer dizer private ), porquê?
É uma forma de segurança, "esconder" as variáveis de instância. Perceba que você não pode fazer, diretamente:
Janela j = new Janela();
j.title = "Titulo";
Precisa usar o setTitle(). Imagine se ao invés de "Titulo", você usasse um inteiro. Daria erro.
Já me disseram que os parâmetros que estão ai (JFrame.EXIT_ON_CLOSE) poderia ser um número, o EXIT_ON_CLOSE tem equivalência com algum número?
Tem sim. Olha aí na classe JFrame:
public static final int EXIT_ON_CLOSE = 3;
Por padrão, nomes de constantes são sempre em maiúsculas, e as palavras são separadas por _.
Vamos supor que minha Janela esteja implementando um ActionListener, essa ordem de hierarquia,pois Janela herda de JFrame e implementa ActionListener, quem é pai de quem? Eu ouvi falar que o this se refere á superclasse,e ntão esses this se referem por exemplo á JFrame?
Janela é filho de JFrame (que é filho de Frame, que é filho de Window, que é ........., que é filho de Object) :razz: Janela implementa todos os métodos de ActionListener, também. Não, this se refere ao próprio objeto. No caso, ao objeto j.
Esse código aí, entendi mais ou menos, só que: Esse (e) na frente do ActionEvent o que é e pra que server? Eu sei o que faz o getSource, mas teóricamente o que el faz? Porque foi usado a superclasse de todos aí e jogado o getSource nela?

Ele é a variável que referencia o ActionEvent. Você poderia ter usado outro nome, se quiser. O getSource() retorna o objeto que gerou o evento. Nesse exemplo, o evento pode ter sido gerado pelo OK ou CANCELAR. Se quiser ver exatamente o que o método faz, só verificando o código...
Eu acho que foi usado Object pra tornar o código menos específico. Poderia ter usado JButton nesse exemplo, mas se tivesse um JTextField, teria que ser usado a superclasse do JTextField e do JButton, então a pessoa usou logo Object, creio eu.

Criado 21 de agosto de 2005
Ultima resposta 21 de ago. de 2005
Respostas 2
Participantes 3