JTable- com icone "clicavel"

7 respostas
tflm

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.

7 Respostas

tflm

Alguem?

tflm

Bom, vou postar o que fiz até agora:

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;
    }
}

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.

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()));

rissato

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

tflm

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.

tflm

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

Obrigado.
Abraços.

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()));

Gobain

opa, sempre as ordens! :thumbup:

Criado 9 de setembro de 2008
Ultima resposta 11 de set. de 2008
Respostas 7
Participantes 3