Como incluir uma coluna com imagens em uma JTABLE?

Eai galera, preciso de uma ajuda! Tenho uma JTable…com duas colunas e estou tentando inserir mais 2 colunas (uma com imagens de ok e outra com del).
Criei uma classe de modelo para as tabelas…

public class AppTabela extends AbstractTableModel{
	private ArrayList linhas = null;
	private String [] colunas = null;
	private boolean [] colsEdicao;
	
	public AppTabela(ArrayList dados, String[] colunas, boolean [] edicao)
	
	{
		setLinhas(dados);
		setColunas(colunas);
		colsEdicao = edicao;
	}

	public int getColumnCount() {return getColunas().length;}
	public int getRowCount() {return getLinhas().size();}
	public Object getValueAt(int rowIndex, int columnIndex) {
		String [] linha = (String [])getLinhas().get(rowIndex);
		return linha[columnIndex];
	}
	public String[] getColunas() {return colunas;}
	public ArrayList getLinhas() {return linhas;}
	public void setColunas(String[] strings) {colunas = strings;}
	public void setLinhas(ArrayList list) {linhas = list;}
	public void setValueAt(Object value, int row, int col){
		String [] linha = (String [])getLinhas().get(row);
		
		linha[col] = (String)value;
		fireTableCellUpdated(row,col);
	}
		public boolean isCellEditable(int row, int col){
		return colsEdicao[col];
	}
	
		public void addRow( String [] dadosLinha){
		getLinhas().add(dadosLinha);
		int linha = getLinhas().size()-1;
		fireTableRowsInserted(linha,linha);
		return;
	}
	
		public void removeRow(int row){
		getLinhas().remove(row);
		fireTableRowsDeleted(row,row);
	}
	public boolean removeRow(String val, int col){
		Iterator i = getLinhas().iterator();
		int linha = 0;
		while(i.hasNext()){
			String[] linhaCorrente = (String[])i.next();
			linha++;
			if( linhaCorrente[col].equals(val) ){
			getLinhas().remove(linha);
			fireTableRowsDeleted(linha,linha);
			return true;				
			}
		}
		return false;
	}
	public void subst(String [ ] dadosLinha,int row)
        {
                 getLinhas().remove(row);
                 getLinhas().add(row,dadosLinha);
	fireTableRowsInserted(row,row);
	return;
            
        }
	public String getColumnName(int col){
	return getColunas()[col];
	}

}

Uma classe para Imagem

class Imagem extends JLabel implements TableCellRenderer{
	  public Imagem(){
	  	setOpaque(true);
	  }
	  
	  public Component getTableCellRendererComponent(JTable table, 
	     Object value, boolean isSelected, boolean hasFocus, int row, 
	     int column){
	    
	     Icon imagem = new ImageIcon("images/ok.jpg");
	         
	     if(isSelected)
	       setBackground(table.getSelectionBackground());
	     else
	       setBackground(table.getBackground());		
	     
	     setIcon(imagem);
	     setText(value.toString());
	     	
	     return this;   	
	  }
	  
	  public void validate() {}
	  public void revalidate() {}
	  protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
	  public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}  
	}

E depois eu a chamo na fução createJTable()

	ArrayList dados = new ArrayList();
	String[] colunas = new String[] { "ID","Nome"};
	boolean [] edicao = {false, false}; 
	conecta = new AppConectaBd();
                conecta.novaConexao();
	    
	try
	{
	String query = "SELECT id,nome FROM cliente";	
	Statement st = conecta.c.createStatement();
	ResultSet rs = st.executeQuery(query);
    while(rs.next())
    {   
           	dados.add(new String[] {String.valueOf(rs.getInt("id")),rs.getString("nome")});
    }
    conecta.fechaConexao();
	}catch(Exception e )
    {
		JOptionPane.showMessageDialog(null, "Não Passou!! Erro:"+e, "bd", JOptionPane.ERROR_MESSAGE);	
    }
		
	modelo = new AppTabela(dados, colunas, edicao);
	JTable jtable = new JTable(modelo);
	TableCellRenderer tcr = new Imagem();
    	TableColumn column = jtable.getColumnModel().getColumn(1);
	column.setCellRenderer(tcr);
	jtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	
	

	return jtable;

O problema é que eu só consigo jogar a imagem antes do conteudo de um campo e eu preciso jogar esta imagem em todas as linhas de outra coluna! Para depois tratar qdo clicar em cima delas… :?

v c isso t ajuda sendo q e um botao e nao imagem mais o conceito e o mesmo

[code]import java.awt.;
import java.awt.event.
;
import java.util.;
import javax.swing.
;
import javax.swing.table.*;

public class TableButton3 extends JFrame
{
public TableButton3()
{
String[] columnNames = {“Date”, “String”, “Integer”, “Decimal”, “”};
Object[][] data =
{
{new Date(), “A”, new Integer(1), new Double(5.1), “Delete0”},
{new Date(), “B”, new Integer(2), new Double(6.2), “Delete1”},
{new Date(), “C”, new Integer(3), new Double(7.3), “Delete2”},
{new Date(), “D”, new Integer(4), new Double(8.4), “Delete3”}
};

    DefaultTableModel model = new DefaultTableModel(data, columnNames);     
    JTable table = new JTable( model )     
    {     
        //  Returning the Class of each column will allow different     
        //  renderers to be used based on Class     
        public Class getColumnClass(int column)     
        {     
            return getValueAt(0, column).getClass();     
        }     
    };     
   
    JScrollPane scrollPane = new JScrollPane( table );     
    getContentPane().add( scrollPane );     
   
    //  Create button column     
    ButtonColumn buttonColumn = new ButtonColumn(table, 4);     
}     
   
public static void main(String[] args)     
{     
    TableButton3 frame = new TableButton3();     
    frame.setDefaultCloseOperation( EXIT_ON_CLOSE );     
    frame.pack();     
    frame.setVisible(true);     
}     
   
class ButtonColumn extends AbstractCellEditor     
    implements TableCellRenderer, TableCellEditor, ActionListener     
{     
    JTable table;     
    JButton renderButton;     
    JButton editButton;     
    String text;     
   
    public ButtonColumn(JTable table, int column)     
    {     
        super();     
        this.table = table;     
        renderButton = new JButton();     
   
        editButton = new JButton();     
        editButton.setFocusPainted( false );     
        editButton.addActionListener( this );     
   
        TableColumnModel columnModel = table.getColumnModel();     
        columnModel.getColumn(column).setCellRenderer( this );     
        columnModel.getColumn(column).setCellEditor( this );     
    }     
   
    public Component getTableCellRendererComponent(     
        JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)     
    {     
        if (hasFocus)     
        {     
            renderButton.setForeground(table.getForeground());     
            renderButton.setBackground(UIManager.getColor("Button.background"));     
        }     
        else if (isSelected)     
        {     
            renderButton.setForeground(table.getSelectionForeground());     
             renderButton.setBackground(table.getSelectionBackground());     
        }     
        else     
        {     
            renderButton.setForeground(table.getForeground());     
            renderButton.setBackground(UIManager.getColor("Button.background"));     
        }     
   
        renderButton.setText( (value == null) ? "" : value.toString() );     
        return renderButton;     
    }     
   
    public Component getTableCellEditorComponent(     
        JTable table, Object value, boolean isSelected, int row, int column)     
    {     
        text = (value == null) ? "" : value.toString();     
        editButton.setText( text );     
        return editButton;     
    }     
   
    public Object getCellEditorValue()     
    {     
        return text;     
    }     
   
    public void actionPerformed(ActionEvent e)     
    {     
        fireEditingStopped();     
        System.out.println( e.getActionCommand() + " : " + table.getSelectedRow());     
    }     
}     

}
[/code]

É eu já partir para esta idéia de usar array de objetos…o problema agora é como eu vou fazer para icrementar este array com os dados do banco…vamos supor que eu queira uma tabela com 4 colunas, mas meu banco só me retorna 2 colunas…como vou tratar os espaços vazio… ?

To inicializando este array assim…final

Object[][] data = new Object[quantidade de linhas][quantidade de colunas]

Vc tem alguma idéia?
Vlw

Olá,

Eu fiz este CellRenderer há algum tempo pra um trabalho na faculdade… Não tá muito bem escrito, mas funciona.
Talvez te ajude

public class ImageIconCellRenderer extends JLabel implements TableCellRenderer {
	private boolean isSelected;
	private boolean hasFocus;
	private ImageIcon[] imagens;

	public ImageIconCellRenderer(ImageIcon[] imagens) {
		this.imagens = imagens;
	}

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

		if(isSelected) setForeground(Color.red);
		else setForeground(Color.black);

		if(hasFocus) setForeground(Color.cyan);

		setIcon(imagens[column]);

		return this;
	}

	public void paint(Graphics g) {
		Color bColor;

		if(isSelected)
			bColor = Color.cyan;
		else
			bColor = Color.white;
		if(hasFocus)
			bColor = Color.red;

		g.setColor( bColor );

		g.fillRect( 0, 0, getWidth() - 1, getHeight() - 1 );

		super.paint( g );
	}
}

Olá Gobain

Eu sou iniciante em java

Estou querendo incluir uma imagem png em um jtable e não estou conseguindo… eu já conseguir montar a classe AbstractTableModel e já carrega os dados só que agora estou precisando colocar uma imagem uma coluna…

Você poderia me ajudar a utilizar essa classe que você fez?

Olá Alex, coloca o seu código do table model pra gente poder discutir a inclusão do renderer. Valeu :thumbup:

Olá Gobain

Valeu cara… obrigado

Eu conseguir fazer:

Segue o link