Re:AJUDA - JTable com IMAGEM

7 respostas
ViniGodoy

É possível, e nem é muito difícil. Basta escrever um CellRenderer personalizado.
Procure sobre o assunto.

7 Respostas

ViniGodoy

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.

ViniGodoy

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.

ViniGodoy

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.

paulogto

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!

paulogto

Tem muitas coisas sobre o assunto, e não sei por onde começar!

Algum exemplo?

paulogto

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
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;
    }
}
Implementação da classe AbstractTableModel
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];
    }
}
Implementação da classe TableCellExample
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 );

    }
}
paulogto

Eu quero trocar a imagem que está na célula o valor não!

Criado 22 de abril de 2008
Ultima resposta 23 de abr. de 2008
Respostas 7
Participantes 2