Adcionar icone em celula de coluna em uma jtable

2 respostas
M

Amigos do forum, tenho tentado colocar icone em uma celula de uma jtable, que esta vinculada a uma list ( quem ja viu o curso siscom java da t2ti sabe do que me refiro).
Então eu pesquisei em diversos foruns e blogs e encontrei diversos codigos que faziam oq procuro, mas nao da maneira que acredito seja mais simples e facil fazer.
Eu planejei criar um bean em um pack qualquer do meu projeto, e arrastar esse bean para a area em branco fora do frame de onde esteja a jtable que estou trabalhando.
Tenho usado netbeans 6.9.1, pois bem, depois de adcionar esse bean, clico com o botao direito em cima da jtable e vou em conteudo da tabela. na aba “colunas” seleciono a coluna das celulas que desejo que seja exibido o icone, e em seguida clico em “Renderizador” e pronto o bean que arrastei para área em branco do frame surge ali.
Apos isso ainda vou em inspector e na arvore “outros componentes” seleciono o bean, vou em propiedades e apago o nome dele no campo text, para que somente o icone seja exibido nas celulas da coluna.

A ideia inicial funciona , se nao fosse por um pequeno detalhe. A coluna que aponta para o bean ( nao opacao Redenrizador ) lista valores 1 e 2 somente
valores 1, deveria exibir o icone tal e valores 2, outro icone, para isso fiz uma cadeia de if testando o valor da celula da coluna que exibi-los, os ifs estao funcionando realizei diversos testes para saber se estao identificando os valores 1 e 2. mas somente o ultimo if é oq esta passando o icone, sendo assim, as celulas que recebem o valor 1 acabam recebendo o icone que seria destinado as celulas de valor 2.

Pq minha ideia seria util ? primeiro pq axo um modo muito pratico de exibir icones em colunas de jtable, tendo um codigo desacoplado do frame, e ser utilizado em qualquer
circunstancia; softwares comerciais, ou jtables que seja destinadas a listas , dividas pagas e nao pagas, e tanta outras combinacoes e possibilidades que o companheiros
ja devam imaginar. A baixo esta o codigo , o codigo nao é 100% de minha autoria, na verdade combinei muitos trechos, e pensei em muitas formas para faze-lo funcionar

Obrigado , pela anteção e tomara que consigamos fazer funcionar.

package br.com.bueno.engine;

import java.awt.Component;
import java.sql.SQLException;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;


/**
 *
 * @author VARIOS AUTORES INCLUSIVE EU
 * email = [email removido]
 */


public class ImageRenderer extends DefaultTableCellRenderer {


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

        int tamanho = table.getRowCount();

        for(int i=0; i< tamanho; i++)
       {
        /// na coluna 0 é listado os valos 1 e 2 . Valor 1 icone tal, valor 2 outro icone.
        Object teste = table.getValueAt(i, 0);

        String    convert = String.valueOf(teste);

// o principal problema e que ele testa a condicao do if, mas nao seta o icone da ocasiao
         if (convert.equals("1"))
         {
         System.out.println(convert+"con"); // COLOQUEI ESTA LINHA PARA TESTAR SE ENTRA NESTE IF
         this.setIcon(new ImageIcon("C:\\confirma.png"));
         }
               else if(convert.equals("2"))
               {
               System.out.println(convert+"can");
               this.setIcon(new ImageIcon("C:\\button_cancel.png"));
                }
        }
        return this;
    }

}
class Model extends DefaultTableModel {

    @Override
    public boolean isCellEditable (int row, int column) {
        return false;
    }

// COMENTEI ESSAS LINHAS PQ ACUSAVA UM ERRO NO NETBEANS E ESTA PARTE DO CODIGO ORIGINAL ERA DESTINADO A OUTRA COISA
//    @Override
//    public Object getValueAt (int row, int column) {
//        return list[row];
//    }
//
//    @Override
//    public int getRowCount () {
//        return list.length;
//    }

    @Override
    public int getColumnCount () {
        return 2;
    }

    @Override
    public String getColumnName (int column) {
        return column == 0? "Name" : "Preview";
    }

    @Override
    public Class<?> getColumnClass (int columnIndex) {
        return String.class;
    }
}

2 Respostas

M

Ow pessoal nenhuma luz não ?

L

Olá Muaottan_Piauassu, É o seguinte, para começar a te ajudar, eu recomendo que voce desista dessa ideia, sem querer ofender! Sério! MAS LEIA TUDO.

Mas provavelmente a sua experiencia com java deve ser melhor que a minha, e para completar estou retornando a estudar java depois de um tempo parado,

Faz um tempo que tento entender a colocação de Editores e Renderers em JTable, parece que muito poucas pessoas no mundo sabe, pelo que venho pesquisando a mas de um mes.

Pelo que venho estudando, EDITORS servem para receber, verificar, controlar o que vai ser inserido nas celulas, enquanto que os RENDERS servem para o VISUAL(ele pinta a celula) da celular, ou seja ele pega o que tem na celular e transforma em Label. Acredito que voce já tenha lido a seguinte pagina:

http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender

Odeio quando me passam essa pagina heheh, mas é o começo! Mesmo se o seu ingles for bom eu recomendo voce traduzir com o google para melhor entendimento!

Me parece que EDITORS e RENDERERS devem trabalhar juntos, mas ja vi muito codigo com implementação so de RENDERERS.

Na tentetiva de lhe ajudar no fundo estou esperançoso que voce possa me ajudar! hheheh, pois, eu tenho “força de vontade”, mas me falta experiencia.

para começar, dos vários codigos que baixei, tenho este:

import java.awt.BorderLayout;
import java.awt.Component;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;

public class Main {
  public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.getContentPane().setLayout(new BorderLayout());

    MyTableModel model = new MyTableModel();

    JTable table = new JTable(model);
    table.setRowHeight(80);
    table.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer());
    JScrollPane pane = new JScrollPane(table);
    frame.getContentPane().add(BorderLayout.CENTER, pane);
    frame.setSize(500, 400);
    frame.setVisible(true);
  }
}

class MyTableModel extends AbstractTableModel {
  
	public Object getValueAt(int row, int column) {
    return "" + (row * column);
  }

  public int getColumnCount() {
    return 4;
  }

  public int getRowCount() {
    return 5;
  }
}

class ImageRenderer extends DefaultTableCellRenderer {
  JLabel lbl = new JLabel();

  //ImageIcon icon = new ImageIcon(getClass().getResource("aplicação src/imagem"));
  ImageIcon icon = new ImageIcon("COLOCA AQUI UM ARQUIVO DE IMAGEM PEQUENO PARA CABER NA CELULA");
  
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column) {
    lbl.setText((String) value);
    lbl.setIcon(icon);
    return lbl;
  }
}

Lhe aconselho a fazer uma classe com base nessa classe, sem usar o conteudo de tabela do netbeans.

Não sei se entendi a sua solicitação, mas dá um retorno ae pra ver se ajudou algo.

Se voce puder dá uma olhada em uma questão que tenho aqui no forum, pode ser que voce me dê uma luz:
http://www.guj.com.br/java/282466-metodo-sendo-invocado

Criado 26 de agosto de 2012
Ultima resposta 16 de set. de 2012
Respostas 2
Participantes 2