É possível, e nem é muito difícil. Basta escrever um CellRenderer personalizado.
Procure sobre o assunto.
Comece estendendo a interface CellRenderer. Basicamente, você tem que retornar um JLabel com uma imagem ou com outra, dependendo da seleção.
Uma boa idéia é ver como o DefaultCellRenderer é implementado.
Peraí… vc não quer simplesmente trocar a imagem. Você quer trocar o valor da célula. Isso é completamente diferente do que você pediu.
Trocar a imagem envolve mexer só na representação visual de um valor. É isso que o CellRenderer faz.
Alteração de valor já é um outro departamento, pertencente ao TableModel. Seu TableModel, atualmente, não é editável. O primeiro passo seria torna-lo editável. Ao invés de uma imagem de check, você poderia usar um checkbox mesmo. Basta fazer a coluna retornar um Boolean.class.
Se vc ainda quiser usar a imagem, capture o evento do click do mouse na tabela, e altere o valor do model caso ele tenha clicado na célula correspondente.
Então beleza…
O cellRenderer recebe dois parâmetros interessante para isso.
O primeiro é o isSelected. Use-o para testar se a linha foi selecionada (tem aquela barra azul em cima).
O segundo é o hasFocus. Marca true se a célula for a selecionada (tem as bordas mais escuras na tabela).
Agora é só testar esses valores com if e retornar a imagem correta.
Pessoal preciso criar uma tela onde tenho um jtable e em algumas colunas tenho imagens, e quando clicar sobre a celula que contem imagem, trocar a imagem atual por uma outra, é possivel fazer isso? eu não tenho nem idéia de como fazer isso, nem de como começar, já que a jtable vai ser preenchida com dados do banco!
Alguém pode me ajudar!
Sou iniciante em JAVA! infelizmente!
Tem muitas coisas sobre o assunto, e não sei por onde começar!
Algum exemplo?
A primeira vez que abro o frame onde está a jtable ele entra aqui na classe CustomTableCellRenderer e preenche corretamente.
Como implemento a alteração da imagem quando clicar na celular?
Se estiver com a celular com a figura check.gif, como alterar para a figura uncheck.gif?
Código Fonte das Classes
Implementação do DefaultTableCellRenderer
[code]import java.awt.Component;
import java.awt.Color;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.ImageIcon;
public class CustomTableCellRenderer extends DefaultTableCellRenderer
{
private ImageIcon iconeCheck = new ImageIcon(this.getClass().getResource(“ckeck.gif”));
private ImageIcon iconeUncheck = new ImageIcon(this.getClass().getResource(“unckeck.gif”));
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
{
Component cell = super.getTableCellRendererComponent
(table, value, isSelected, hasFocus, row, column);
if( value instanceof Integer )
{
Integer amount = (Integer) value;
if( amount.intValue() == 0 )
{
setBackground(Color.white);
setIcon(iconeUncheck);
}
else if( amount.intValue() == 1 )
{
setBackground(Color.white);
setIcon(iconeCheck);
}
else if( amount.intValue() == 2 )
{
setBackground(Color.RED);
setIcon(null);
}
}
return this;
}
}[/code]
Implementação da classe AbstractTableModel
[code]import javax.swing.table.AbstractTableModel;
public class ExampleTableModel extends AbstractTableModel
{
private final String[] columnNames = { “Month”, “Income” };
final Object[][] data = {
{"January", new Integer(0)},
{"February", new Integer(1)},
{"March", new Integer(1)},
{"April", new Integer(0)},
{"May", new Integer(2)},
{"June", new Integer(1)},
{"July", new Integer(0)},
{"August", new Integer(1)},
{"September", new Integer(2)},
{"October", new Integer(0)},
{"November", new Integer(1)},
{"December", new Integer(1)}
};
public Class getColumnClass( int column )
{
return getValueAt(0, column).getClass();
}
public int getColumnCount()
{
return columnNames.length;
}
public String getColumnName( int column )
{
return columnNames[column];
}
public int getRowCount()
{
return data.length;
}
public Object getValueAt( int row, int column )
{
System.out.println("data[row][column]: "+data[row][column]);
return data[row][column];
}
}[/code]
Implementação da classe TableCellExample
[code]import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.table.TableCellRenderer;
import javax.swing.JFrame;
import javax.swing.JTable;
public class TableCellExample
{
public static void main( String[] args )
{
JTable table = new JTable( new ExampleTableModel() );
TableCellRenderer renderer = new CustomTableCellRenderer();
try
{
table.setDefaultRenderer( Class.forName
( "java.lang.Integer" ), renderer );
}
catch( ClassNotFoundException ex )
{
System.exit( 0 );
}
JFrame frame = new JFrame();
frame.addWindowListener(
new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
);
frame.getContentPane().add( table );
frame.pack();
frame.setVisible( true );
}
}[/code]
Eu quero trocar a imagem que está na célula o valor não!