Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rodrigo.rrch

Botão em jTable (AbstractTableModel)

Recommended Posts

Bom dia, tudo bem ?

 

Venho aqui mais uma vez pedir uma luz hehe. Eu fiz um pequeno exemplo com 4 classes, são elas:

 

ButtonColumn.java -> Classe que cria o botão

TabelaModelTeste.java -> Classe AbstractTableModel

TesteBean.java -> Bean set e get (cod e codOrig)

jdialogTest.java -> Gui do aplicativo

 

O problema é o seguinte, ele cria o botão na jtable (pelo menos visualmente - aparece um botao arredondado) mas quando eu clico no botão ele não faz nada, simplesmente não executa os métodos getTableCellEditorComponent, getCellEditorValue e actionPerformed da classe ButtonColumn.

 

Fazendo uma analogia parece que estou clicando em uma imagem

 

Segue os códigos

 

TabelaModelTeste.java

public class TabelaModelTeste extends AbstractTableModel{

   private final int COL_COD = 0;
   private final int COL_CODORIG = 1;
   private final int COL_ACAO = 2;

   private ArrayList<TesteBean> teste;
   private String[] colunas = new String[] { "Cod", "Cod Orig", ""};

   public TabelaModelTeste(){
       teste = new ArrayList<TesteBean>();
   }

   public TabelaModelTeste(ArrayList<TesteBean> lista){
       this();
       teste.addAll(lista);
   }

   @Override
   public int getRowCount() {
       return teste.size();
   }

   @Override
   public int getColumnCount() {
       return colunas.length;
   }

   @Override
   public String getColumnName(int column) {
       return colunas[column];
   }

   @Override
   public Object getValueAt(int rowIndex, int columnIndex) {
       TesteBean v = (TesteBean) teste.get(rowIndex);

       switch (columnIndex) {
           case COL_COD:
               return v.getCod();
           case COL_CODORIG:
               return v.getCodOrig();            
           case COL_ACAO:
               return "Apagar";
           default:        
               throw new IndexOutOfBoundsException("columnIndex out of bounds");
       }
   }
}

 

jdialogTest.java

public class jdialogTest extends javax.swing.JDialog {

   ArrayList<TesteBean> lista;
   private TabelaModelTeste model;

   public jdialogTest(java.awt.Frame parent, boolean modal) {
       super(parent, modal);
       initComponents();

       lista = new ArrayList<TesteBean>();

       lista.add(new TesteBean(1,2));
       lista.add(new TesteBean(1,2));
       lista.add(new TesteBean(4,1));

       model = new TabelaModelTeste(lista);
       jTableTeste.setModel(model);

       ButtonColumn buttonColumn = new ButtonColumn(jTableTeste, 2);
   }

   // RETIREI O CÓDIGO AQUI POR SER PADRÃO DO JDIALOG 

   // private void initComponents() ...
   // public static void main(String args[]) ...
}

 

ButtonColumn.java

public class ButtonColumn extends AbstractCellEditor  
    implements TableCellRenderer, TableCellEditor, ActionListener  
{  
    JTable table;  
    JButton renderButton;  
    JButton editButton;  
    String text;  

    public ButtonColumn(JTable table, int column)
    {
        super();
        this.table = table;
        renderButton = new JButton();

        editButton = new JButton();
        editButton.setFocusPainted( false );
        editButton.addActionListener( this );

        TableColumnModel columnModel = table.getColumnModel();
        columnModel.getColumn(column).setCellRenderer( this );
        columnModel.getColumn(column).setCellEditor( this );
    }

    public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        if (hasFocus)
        {
            renderButton.setForeground(table.getForeground());  
            renderButton.setBackground(UIManager.getColor("Button.background"));  
        }
        else if (isSelected)  
        {
            renderButton.setForeground(table.getSelectionForeground());  
             renderButton.setBackground(table.getSelectionBackground());  
        }
        else  
        {
            renderButton.setForeground(table.getForeground());  
            renderButton.setBackground(UIManager.getColor("Button.background"));  
        }

        renderButton.setText( (value == null) ? "" : value.toString() );
        return renderButton;
    }  

   @Override
    public Component getTableCellEditorComponent(
        JTable table, Object value, boolean isSelected, int row, int column)
    {
        text = (value == null) ? "" : value.toString();
        editButton.setText( text );
        return editButton;
    }

   @Override
    public Object getCellEditorValue()
    {
        return text;
    }

   @Override
    public void actionPerformed(ActionEvent e)
    {  
        fireEditingStopped();  
        System.out.println( e.getActionCommand() + " : " + table.getSelectedRow());  
    }  
}

 

TesteBean.java

public class TesteBean {

   private int cod;
   private int codOrig;

   public TesteBean() {    
   }

   public TesteBean(int cod, int codOrig) {
       this.setCod(cod);
       this.setCodOrig(codOrig);
   }

   public int getCod() {
       return cod;
   }

   public void setCod(int cod) {
       this.cod = cod;
   }

   public int getCodOrig() {
       return codOrig;
   }

   public void setCodOrig(int codOrig) {
       this.codOrig = codOrig;
   }            
}

 

Agradeço desde ja.

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você já fez debug do evento click no botão pra ver o que lhe retorna?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim debuguei. ^^

 

Ele não me retorna nada.

Ele cria o botão porem quando clico nele ele não executa o método actionPerformed.

 

Estranhamente se eu usar o DefaultTableModel meu código funciona. Mas com AbstractTableModel ele não rola.

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.