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.
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!!!
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()));
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!
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]