Herança

12 respostas
G

Boa Noite pessoal, tenho a seguinte dúvida no código abaixo:

import javax.swing.*;
public class TestTabledPane extends JFrame{

	private JTabbedPane tPane;
	
    public TestTabledPane() {
    	
    	tPane = new JTabbedPane();
    	tPane.add("#Aba1", panel());
    	tPane.add("#Aba2", panel2());
    	
    	this.add(tPane);
    	this.setVisible(true);
    	
    }
    
    
    public JPanel panel(){
    	
    	JPanel jp = new JPanel();
    	//jp.add(new JLabel("Campo1"));
    	//jp.add(new JTextField(20));
    	
    	return jp;
    }
    
    public JPanel panel2(){
    	
    	JPanel jp = new JPanel();
    	//jp.add(new JLabel("Campo2"));
    	//jp.add(new JTextField(20));
    	
    	return jp;
    }
}

Aí eu utilizo a herança:

class Frm001 extends TestTabledPane {

      Frm001() {

         setTitle("Cadastro de Clientes");

      }

      public static void main(String args[]) {

             TestTabledPane obj = new Frm001();
             obj.setVisible(true);

      }
}
}

Pergunta: Nesta herança, como faço para alterar o nome das Abas para por exemplo “Dados Pessoais” e “Crédito” ou ainda acrescer mais uma aba, e colocar o textfield NOME na aba “Dados Pessoais”??
Obrigado.

12 Respostas

U

Bom, o que vc está querendo é ter acesso ao JTabbedPane do pai da sua classe, correto?!
Para tal, vc pode marcar a visibilidade dessa sua propriedade como “protected” e não como “private”.
Protected dá proteção de pacote e herança, ou seja, todo mundo dentro do pacote da sua classe, ou que são filhas dela, vão enxergar tua propriedade normalmente, como se fosse delas.

Mas isso não é legal. Nada garante que uma outra classe fora a TestTabledPane avacalhe suas abas.
Vc pode fazer então métodos, públicos ou protegidos, que expõe a funcionalidade desejada.
Como assim?!
Por exemplo, um método que adiciona mais uma panel nas suas abas.

Algo assim:

public class TestTabledPane extends JFrame {  
   
     private JTabbedPane tPane;  
       
     public TestTabledPane() {  
        //...
     }

     protected void addNovaAba( String titulo, JPanel aba ) {
          tPane.addTab( titulo, aba );
          //....
     }  
     
      //...
 }

E os filhos…

public class Frm00 extends TestTabledPane  { 

       public Frm00() {
          setTitle("Cadastro de Clientes");
          addNovaAba("Dados Pessoais", new JPanel() ); 
       }

 }

Deu pra sacar?!

Espero ter ajudado…

[]s

rafaelglauber

Protected só é acessível nas própria classe ou em suas especializações, em outras classes do mesmo pacote que não são filhas dessa classe um metodo ou atributo protected não é acessível.

U

Protected só é acessível nas própria classe ou em suas especializações, em outras classes do mesmo pacote que não são filhas dessa classe um metodo ou atributo protected não é acessível.

hhmm… ué, como assim?!
Num teste rápido aqui no eclipse, tudo funcionou… :shock:

package br.guj.pacote;

public class A {

	protected String nome;

}
package br.guj.pacote;

public class B {
	
	public B() {
		A a = new A();
		a.nome = "uchoaaa";
	}

}

E o teste, por fim…

package br.guj.outro.pacote;

import br.guj.pacote.A;

public class Teste {

	public Teste() {
		A a = new A();
		a.nome = "uchoaa";     //PAN! Erro de compilação...
	}

}

[]s

P

Métodos private não são herdados.

Nao seria melhor usar composição ao invés de herança, nesse caso?

P

Ué uchoaaa, certo, mas estão no mesmo pacote as duas primeiras classes.

rafaelglauber

uchoaa,

leia isso: http://www.guj.com.br/posts/list/27546.java

tinha essa mesma visão, ainda mais que programo muito em Delphi e lá é como falei acima…mas estou certo que sua afirmação é verdadeira.

U

Sergio Figueras:
Métodos private não são herdados.

Nao seria melhor usar composição ao invés de herança, nesse caso?

Opa, peraê, peraê, deves estar confundindo…
Eu justamente falei que os membros da classe com visibilidade protected são herdados e visíveis também por qualquer outra classe dentro do mesmo pacote.
Equanto com private, não.
O rafaelglauber comentou que outras classes no mesmo pacote não tinha acesso…

E não meu exemplo, foi apenas um exemplo! :smiley: rs
Não é pra existir relacionamentos, apenas quis falar de acesso por pacotes…
Vou até trocar o nome das classes para não dar mais confusão… hehe

[]s

U

rafaelglauber:
uchoaa,

leia isso: http://www.guj.com.br/posts/list/27546.java

tinha essa mesma visão, ainda mais que programo muito em Delphi e lá é como falei acima…mas estou certo que sua afirmação é verdadeira.

Pois é… por um momento, me deixastes na dúvida. rs
Falando sobre, nunca soube ao certo o que o acesso “default” fazia, mas o link ajudou…

kina:
Sim, é exatamente isso.
private = somente a classe
default = mesmo pacote
protected = default + subclasses
public = qualquer classe em qualquer pacote

[]s

G

obrigado amigos pela atenção, Sérgio vc acha que seria mais indicado a composiçao? procurei material na internet sobre o assunto mas não consegui entender como aplicá-la neste caso… poderia dar um pequeno exemplo ?? obrigado.

Kassiane_Pretti

Dá uma olhadinha aqui:

http://www.google.com.br/search?hl=pt-BR&q=composiçao+em+java&meta=

P

ggero, Sempre é mais interessante utilizar composição ao invés de herança. Herança limita muito as coisas e voce perde caso tenha que fazer alguma alteração que não é pra todo mundo.

Dá uma lida na apostila Fj21 da caelum, no forum tem o Link. É muito boa.

G

Obrigado mesmo.

Criado 15 de julho de 2008
Ultima resposta 17 de jul. de 2008
Respostas 12
Participantes 5