Dúvida simples (JComponent)

8 respostas
homisinho

Existem vários exemplos onde os programadores utilizam o JComponent como nesse exemplo a seguir:

public class modeloTabCellEditor extends 
   AbstractCellEditor implements TableCellEditor{

    JComponent component = new JTextField();

    public Object getCellEditorValue() {        
        return ((JTextField)component).getText();
    }
    

    public Component getTableCellEditorComponent(JTable table, 
             Object value, boolean isSelected, int row, int column) {

            if (isSelected) {
                ((JTextField)component).setBorder(
                         BorderFactory.createBevelBorder(BevelBorder.LOWERED));
            }

            // Configure the component with the specified value
            ((JTextField)component).setText(value.toString());

            // Return the configured component
            return component;
    }

}

Qual a vantagem nesse caso em declarar component como um JComponent e não como um JTextField?

8 Respostas

Marky.Vasconcelos

Pelo mesmo motivo de se declarar:

List list = new ArrayList();

No lugar de:

ArrayList list = new ArrayList();
R

Ao usar JTextField você “amarra” seu código a uma classe muito específica. Às vezes o componente editor de uma coluna de uma JTable não é um JTextField - poderia ser um seletor de cor, por exemplo. Então, é mais adequado usar a classe básica JComponent.

M

Vantagem nenhuma… Os metodos só retornam um Component para padronizar, pois se voce for ver os componentes swing são extensões do JComponent…

R

miguel: esse é justamente o objetivo do uso de Component/JComponent - definir uma classe básica. JComponent herda de Component para manter a compatibilidade com AWT, e Swing oferece JComponent para prover uma raiz comum aos criadores de componentes. Se o método getTableCellEditorComponent() da interface TableCellEditor retornasse um JTextField em vez de um Component, isso limitaria muito a liberdade do desenvolvedor - como eu faria quando quisesse retornar uma JComboBox? Então, considero que é, sim, uma vantagem.

homisinho

Muito obrigado pelas respostas.
Realmente essa é uma boa prática.

L

Não seria mais fácil colocar o Component somente no retorno no método “getTableCellEditorComponent” e tratar em todo o resto como um JTextField, já que o cara tá colocando explicitamente um “new JTextField()”?
Isso manteria a generalização do Component e evitaria os maltidos casts que tão rolando solto nessa implementação.

R

Leo: de acordo. Como nessa situação específica o método retorna sempre um JTextField, melhor declarar diretamente como JTextField e evitar os casts.

jidlafe

Olá homisinho, não esqueça também que o Java é uma linguagem
“escalável” e robusta. E que o OOD faz parte de toda a API da linguagem.
Se olhares na hierarquia de classes “swing” a JTextField é uma extensão de JTextComponent que por sua vez é uma extensão de JComponent
Sendo assim o princípio de Polimorfismo é aplicado de forma correta. Pois você tem uma classe mais genêrica que comporta as
classes mais específicas a baixo na hierarquia.

Criado 1 de julho de 2009
Ultima resposta 13 de ago. de 2009
Respostas 8
Participantes 6