JTable- com icone "clicavel"

Ba tarde.

Criei uma classe supergrid, que nada mais é do que um panel com um grid.
Todo o processo de CRUD está ficando automatizado. Inclusive dos CellEditors…

Contudo, estou tentando deixar uma das colunas do grid, a ultima, com um ícone Excluir, e desejo que ao clicar nesse ICO, eu consiga capturar o evento e detonar a linha do grid.

Já inseri o ICO, depois percebi que qndo o cara clica em cima, como o grid está no DefaultTableModel, a figura some e o campo fica habilitado para edição.
Resolvi isso tranformando essa coluna como NAO-EDITAVEL.

Porem nao achei nada sobre um Ico disparar um evento.
Entao, recomecei o processo só que com um button. Porém nao tem como colocar um botao como CellEditors.
Entao eu fiz o seguinte:

dr = new DefaultTableCellRenderer();
dr.setIcon(botao.getIcon());
grid.getColumnModel().getColumn(indiceColuna).setCellRenderer(dr);

Agora numa classe de aplicacao, já com o supergrid todo preparado, eu invoco esse metodo do botao, adiciono o botao ao listener, mas nada acontece.

o que pode estar ocorrendo?

obrigado.

Alguem?

Bom, vou postar o que fiz até agora:

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

public class ButtonCellRenderer extends JButton implements TableCellRenderer {

public ButtonCellRenderer(String path) {
    setOpaque(true);
    ImageIcon ico = new ImageIcon(path);
    this.setIcon(ico);
}

public Component getTableCellRendererComponent(JTable table, Object value,
    boolean isSelected, boolean hasFocus, int row, int column) {
    if (isSelected) {
        setForeground(table.getSelectionForeground());
        setBackground(table.getSelectionBackground());
    } else{
        setForeground(table.getForeground());
        setBackground(UIManager.getColor("Button.background"));
    }
    setText( (value ==null) ? "" : value.toString() );
    return this;
}

}[/code]

Está classe acima renderiza o Botao numa determinada coluna do JTable.

/** * Metodo que inclui um botao numa coluna do grid. * @param coluna */ public void setIncluiBotaoEmColunaGrid(int coluna,String path){ ButtonCellRenderer bcellRenderer = new ButtonCellRenderer(path); bcellRenderer.addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mouseClicked(java.awt.event.MouseEvent arg0) { obsForm obj = new obsForm(); obj.setVisible(true); obj.setResizable(false); obj.setTitle("Observação"); JOptionPane.showMessageDialog(null, "da pra funcionar?"); } }); grid.getColumnModel().getColumn(coluna).setCellRenderer(bcellRenderer); }
Esta acima, faz parte da Classe do meu grid.

Eu chamo ela num JFrame, passando a coluna que eu quero que apareça o botao, e o path da imagem que eu quero que o botao tenha.

O problema é que o evento do clicar do mouse neste botão, nao funciona de jeito nenhum!!!

O que eu fiz de errado?

Vlz.

Olá,

Numa situação parecida com a sua eu fiz o seguinte, adicionei um MouseListener na tabela e que ve se a coluna clicada foi a do ícone, e então exclui a linha selecionada.

if(horariosTable.getRowCount() > 0) if(horariosTable.getSelectedColumn() == 6) if(JOptionPane.showConfirmDialog(this,"Tem certeza que deseja excluir o ponto?","Exclusãoo de ponto",JOptionPane.YES_NO_OPTION) == 0) excluirPonto(((HorariosTableModel)horariosTable.getModel()) .getRow(horariosTable.getSelectedRow()));

ueh, se vc adicionar um ActionListener no botão deveria funcionar normalmente… o que está aconcetendo? vc está recebendo alguma exception?

Nenhuma Exception, só não funciona.

Uma coisa que eu percebi que tinha errado, em relação ao código que postei, é que o tipo ButtonCellRenderer estava com visibilidade local. Então eu coloque-o como atributo do objeto.
Eu realmente não sei o que há de errado!

Obrigado.

Seu jeito funcionou direitinho.
Bem simples e legal. Gostei.

Obrigado.
Abraços.

[quote=Gobain]Olá,

Numa situação parecida com a sua eu fiz o seguinte, adicionei um MouseListener na tabela e que ve se a coluna clicada foi a do ícone, e então exclui a linha selecionada.

if(horariosTable.getRowCount() > 0) if(horariosTable.getSelectedColumn() == 6) if(JOptionPane.showConfirmDialog(this,"Tem certeza que deseja excluir o ponto?","Exclusãoo de ponto",JOptionPane.YES_NO_OPTION) == 0) excluirPonto(((HorariosTableModel)horariosTable.getModel()) .getRow(horariosTable.getSelectedRow()));[/quote]

opa, sempre as ordens! :thumbup: