Adicionar um JLabel no JTable

Olá

Na verdade eu estou tentando adicionar uma imagem no JTable… mas pesquisando vi que algumas pessoas conseguiram isso adicionando a no JLabel e depois adicionando esse JLabel ao JTable.

Adicionar a imagem no JLabel eu já conseguir…o que não conseguir ainda foi adicionar o JLabel no JTable.

Como passo isso?

  1. Altere seu tableModel para retornar um tipo de dado especial para essa coluna (por exemplo Image.class);

  2. Crie um TableCellRenderer que retorne o seu JLabel com a imagem:
    http://www.exampledepot.com/egs/javax.swing.table/CustRend.html

  3. Use o método setDefaultRenderer do JTable para associar o tipo retornado pelo model (Image.class) ao CellRenderer criado no passo 2.

ViniGodoy… ainda não conseguir, já tentei vários exemplos e nada.

é fdoa ser iniciante.

olá

Eu tentei fazer assim:


 class mcr extends DefaultTableCellRenderer{   
        public Class getColumnClass(int c) {
            return ImageIcon.class;
        }
    }

        jTable1.getColumn("Title 1").setCellRenderer(new mcr());
        DefaultTableModel Tmodel=(DefaultTableModel) jTable1.getModel();
        jTable1.setRowHeight(60);
        ImageIcon icon = new ImageIcon("/imagens/impressora.png");
        Tmodel.setValueAt(icon, 0, 0);

mas só aparece o caminho da imagem no caso ("/imagens/impressora.png")… aparece o esse texto em vez da imagem.

O que estou fazendo de errado?

Primeiro, quem tem que retornar o tipo da coluna é o TableModel, não o TableCellRenderer. Lembra que já te falei várias vezes para não utilizar o DefaultTableModel? Pois é, na hora de usar recursos mais avançados como esse, ele não te dá nenhum suporte. Comece aprendendo a montar seu próprio TableModel;

Depois, você precisa dizer ao JTable que colunas do tipo ImageIcon usam o Renderer do tipo mcr (um péssimo nome de classe, por sinal).

Finalmente, você precisa fazer com que o Renderer efetivamente desenhe a imagem, nem que seja retornando o ImageIcon que estará no valor, ou um ImagePanel.

Cara… acho que vc não falou isso comigo antes…

Eu não entendi onde vou encaixar essa linha no meu código, mas pelo visto ela não pode se encaixar nele.

O que não entendi foi vc esta falando pra não usar o DefaultTableModel e no caso pelo que vi o outro TableModel tem que colocar muito mas código…

isso não seria ruim porque se torna pouco prático?

Qual a vantagem então mesmo

Eu criei o outro tópico porque pensei que vc não tinha visto a minha pergunta…

sorry

Primeiro, é que você coloca muito menos código. Essa impressão você tem porque toda lógica do model fica concentrada em um só lugar. Do contrário do Default, que vai espalhando código porco por toda sua interface gráfica.
Segundo, porque o TableModel próprio trabalha com sua própria classe de negócio. Não há necessidade de casts, você pode aproveitar dados que não estão sendo exibidos no seu JTable.
Terceiro, o DefaultTableModel é muito pouco eficiente. Pra começar ele duplica os dados de modelo. Depois, ele faz isso usando Vectors de Vectors, tudo com sincronização desnecessária, o que gera um custo de tempo considerável em tabelas maiores.
Quarto, porque o DefaultTableModel não dá suporte a recursos como: dizer quais colunas são ou não editáveis, indicar qual é o tipo de renderer e editor, para uma coluna, etc;
Quinto, no DefaultTableModel, não permite que você valide os dados durante sua inserção, impedindo de inserir coisas inválidas no seu JTable.
E sexto, mas não menos importante, porque é muito mais difícil fazer as coisas usando o DefaultTableModel. Algumas tarefas simples levam muitas linhas de código e a maioria sujeita a falhas.

Acredite. Se o DefaultTableModel prestasse, nem eu, nem muitos outros usuários do GUJ estaríamos recomendado a todos que aprendessem a fazer do jeito certo.
É tão importante fazer um model proprio que eu carrego esse aviso na minha assinatura.

Certo entendi… mas como disse ante eu sou iniciante em java… e até agora não conseguir encontrar um exemplo completo usando TableModel só encontro trecho de códigos e ai fica difícil entender e aprender a utilizar ele.

Onde eu encontro ou se vc tem um código usando TableModel completo até a listagem dos dados.

Não sei se eu estou enganado mas que vi o pessoal gosta muito de criar o jframe via código e eu gosto de criar pelo netbeans ai quando vejo um código usando tablemodel fico sem entender como modificar ele para minha necessidade porque estou usando o componente adicionado no jframe pelo netbeans.

Não sei se deu pra entender.

Teria como vc conseguir um projeto de exemplo utilizando o tablemodel e se possível já adicionando uma imagem?

Obrigado

O netbeans permite que você troque o model do seu JTable. Não sei exatamente como, mas sei que é possível.

Desculpa ressucitar o tópico,

mas estou tendo o mesmo tipo de problema.

Segui os passos acima, mas não consigo colocar imagem na minha tabela.

Minha tabela será composta apenas de imagens (ira desenhar um grafo qualquer).

Segue abaixo o meu código

TableModel

public class TabelaDeGrafos  extends AbstractTableModel{
  
    private List<Object[]> valores;         
  
    public TabelaDeGrafos(List<JLabel[]> valores) {  
          this.valores = new ArrayList<Object[]>(valores);  
    }  
  
    public int getRowCount() {  
        return valores.size();  
    }  
  
    public int getColumnCount() {  
        return valores.get(0).length;  
    }  
  
    public String getColumnName(int columnIndex) {  
        return String.valueOf(columnIndex);
    }  
  
    public ImageIcon getValueAt(int row, int column) {  
        JLabel[] titulo = (JLabel[]) valores.get(row);  
        ImageIcon image = (ImageIcon) titulo[column].getIcon();
        return image;
    }  
  
    public  void setValueAt(String aValue, int rowIndex, int columnIndex) {  
        Object[] titulo = valores.get(rowIndex);  
        titulo[columnIndex] = new ImageIcon("img/" + aValue);
    }  
  
    public  Class getColumnClass(int columnIndex) {  
        return ImageIcon.class;  
    }  
      
    public boolean isCellEditable(int rowIndex, int columnIndex) {  
        return false;  
    }  
}

TableCellRenderer

[code]
public class FormatacaoDaTabela implements TableCellRenderer {

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

 JLabel lbl = (JLabel) value; 

return lbl;

}

}[/code]

            grade.setModel(new TabelaDeGrafos(retornaListaParaPopularTabela()));
            grade.setDefaultRenderer(ImageIcon.class, new FormatacaoDaTabela());

Se mando imprimir na tabel o getText do JLabel, imprime certinho, mas se altero pra ImageIcon, fica em branco minha tabela, e se altero o tipo pra Image, imprime o caminho

Acho (quase certeza) que não estou sabendo implenetar o TableCellRenderer

Alguem poderia me dar uma luz… são 4:10 da manhã e não consegui sair do lugar…hehehe

Marcos

dê uma olhada nesse link

http://www.guj.com.br/java/246143-ordenar-e-incluir-imagem-no-jtable-resolvido/2

Tem o código pronto ai é só adaptar a sua necessidade

Eu fiz seguindo o exmplo que está la no tópico, mas continua sem funcionar.

Segue abaixo a forma que fiz

DefaultTableCellRenderer

public class FormatacaoDaTabela extends DefaultTableCellRenderer {

protected void setValue(Object value){  
  
        if (value instanceof ImageIcon){  
  
            if (value != null){  
                ImageIcon d = (ImageIcon) value;  
                setIcon(d);  
            } else{  
                setText("");  
                setIcon(null);  
            }  
              
        } else {  
            super.setValue(value);  
        }  
          
    }
}

TableModel

public class TabelaDeGrafos  extends AbstractTableModel{
  
    private List<Object[]> valores;         
  
    public TabelaDeGrafos(List<JLabel[]> valores) {  
          this.valores = new ArrayList<Object[]>(valores);  
    }  
  
    public int getRowCount() {  
        return valores.size();  
    }  
    
    public int getColumnCount() {  
        return valores.get(0).length;  
    }  
  
    public String getColumnName(int columnIndex) {  
        return String.valueOf(columnIndex);
    }  
  
    public ImageIcon getValueAt(int row, int column) {  
        JLabel[] titulo = (JLabel[]) valores.get(row);  
        ImageIcon image = (ImageIcon) titulo[column].getIcon();
        return image;
    }  
  
    public  void setValueAt(String aValue, int rowIndex, int columnIndex) {  
        Object[] titulo = valores.get(rowIndex);  
        titulo[columnIndex] = new ImageIcon("img/" + aValue);
    }  
  
    public  Class getColumnClass(int columnIndex) {  
        return Image.class;  
    }  
      
    public boolean isCellEditable(int rowIndex, int columnIndex) {  
        return false;  
    }  
}

E to setando a tabela assim

            grade.setModel(new TabelaDeGrafos(retornaListaParaPopularTabela()));
            FormatacaoDaTabela renderer = new FormatacaoDaTabela();  
            grade.getColumnModel().getColumn(2).setCellRenderer(renderer);

Coloquei o grade.getColumnModel().getColumn(2).setCellRenderer(renderer); pra fazer um teste.
Na coluna 2 está em branco, nas demais colunas aparece apenas o caminho da imagem (“img/188.gif”)

Ninguem tem ideia do que to fazendo de errado?? :cry:

Você sobrescreveu o método errado do seu CellRenderer.

ViniGodoy,

Eu segui o exemplo que o alexpassos colocou no outro tópico
Qual o método que tenho que sobrescrever?

No exemplo ele sobrescreve o setValue.

Desculpa, mas realmente to apanhando pro JTable.

Normalmente se sobrescreve o

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex)

Consegui desenhar finalmente. :smiley:
Mais uma vez, vlww pela ajuda, salvou minha pele e minha nota no trabalho…hehehehe