Ae Galera, estou com problema em incluir um botão na minha Table, consigo colocar o botão na ultima coluna e pra cada linha tudo blz, mas parece que ele esta bloqueado ao clicar nele a coluna esta inativa, somente as que contem dados consigo “selecionar”. Esta minha Table é implementada desde o modelo até sua criação. Para incluir esse botão na coluna utilizo a implementação de: TableCellRenderer e TableCellEditor. Abaixo todas as classes da minha Table:
Essa classe é responsável por implementar o botão em uma coluna na Table:
JTableButtonColumn.java
public class JTableButtonColumn extends AbstractCellEditor
implements TableCellRenderer,TableCellEditor,MouseListener{
private JTable jTable = null;
private TableColumnModel columnModel = null;
private int column;
private String text = "ABC";
private ImageIcon image = null;
private JButton deleteButton = null;
public JTableButtonColumn(JTable jTable,int column) {
super();
this.jTable = jTable;
this.column = column;
this.initialize();
}
public void initialize(){
deleteButton = new JButton();
deleteButton.setFocusPainted( false );
this.columnModel = this.jTable.getColumnModel();
this.columnModel.getColumn(column).setCellRenderer( this );
this.columnModel.getColumn(column).setCellEditor( this );
}
@Override
public void mouseClicked(MouseEvent e) {
JOptionPane.showMessageDialog(null, "FUI CLICADO");
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (hasFocus)
{
deleteButton.setForeground(table.getForeground());
deleteButton.setBackground(UIManager.getColor("Button.background"));
}
else if (isSelected)
{
deleteButton.setForeground(table.getSelectionForeground());
deleteButton.setBackground(table.getSelectionBackground());
}
else
{
deleteButton.setForeground(table.getForeground());
deleteButton.setBackground(UIManager.getColor("Button.background"));
}
deleteButton.setText("TESTE");
return deleteButton;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
this.text = (value == null) ? "" : value.toString();
deleteButton.setText(this.text);
return deleteButton;
}
@Override
public Object getCellEditorValue() {
return text;
}
@Override
public CellEditorListener[] getCellEditorListeners() {
// TODO Auto-generated method stub
return super.getCellEditorListeners();
}
@Override
public void addCellEditorListener(CellEditorListener arg0) {
// TODO Auto-generated method stub
super.addCellEditorListener(arg0);
}
//Methods not Utilized
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
//End
}
Classe que implementa o modelo da Table:
JTableModel.java
package pckTeste.gui;
import javax.swing.table.AbstractTableModel;
public class JTableModel extends AbstractTableModel {
private String[] colunas;
private Object[][] linhas;
public JTableModel(Object[][] linhas,String[] colunas){
setLinhas(linhas);
setColunas(colunas);
}
//Obtem o valor da linhas e coluna
public Object getValueAt(int rowIndex, int columnIndex){
//Retorna linha
return linhas[rowIndex][columnIndex];
}
//Seta valor da linha e coluna
public void setValueAt(Object value,int rowIndex, int columnIndex){
linhas[rowIndex][columnIndex] = value;
fireTableCellUpdated(rowIndex, columnIndex);
}
//Adiciona nova linha
public void addRow(Object[][] dadosLinha){
setLinhas(dadosLinha);
int linha = getLinhas().length -1;
fireTableRowsInserted(linha,linha);
}
public String getColumnName(int col){
return getColunas()[col];
}
//Retorna o numero de colunas
public int getColumnCount(){
return getColunas().length;
}
//Retorna o numero de linhas
public int getRowCount(){
return getLinhas().length;
}
public Object[][] getLinhas(){
return linhas;
}
public String[] getColunas(){
return colunas;
}
public void setLinhas(Object[][] dados){
linhas = dados;
}
public void setColunas(String[] dados){
colunas = dados;
}
}
Classe que implementa a criação da Table e insere os dados
JTableGeneric.java
public class JTableGeneric extends JTable{
private JTableModel model = null;
private Object[][] linhas = null;
private String[] colunas = null;
public JTableGeneric(String[] colunas){
this.colunas = colunas;
this.linhas = new Object[1][colunas.length];
model = new JTableModel(this.linhas,this.colunas);
}
public void popularJTable(ResultSet rs,int opcaoTemp)throws SQLException{
ResultSetMetaData rsmd = rs.getMetaData();
int r = 0;
rs.last();
r = rs.getRow();
rs.beforeFirst();
Object[][] linhaNova = new Object[r][model.getColumnCount()];
r = 0;
while(rs.next()){
if(opcaoTemp == 0){
for(int i=0; i < rsmd.getColumnCount(); i++){
switch (rsmd.getColumnType(i + 1)) {
case Types.INTEGER:
linhaNova[r][i] = ""+rs.getInt(rsmd.getColumnName(i + 1));
break;
case Types.VARCHAR:
linhaNova[r][i] = rs.getString(rsmd.getColumnName(i + 1));
break;
}
}
model.addRow(linhaNova);
r++;
}else{ //Atualmente utilizando essa interação
for(int i=0; i < rsmd.getColumnCount(); i++){
linhaNova[r][i] = rs.getString(rsmd.getColumnName(i + 1));
}
model.addRow(linhaNova);
r++;
}
}
this.setModel(model);
}
}
Criação dos objetos:
..............
cadastroDAO = new CadastroDAO();
jTableCreate = new JTableGeneric(colunas);
jTableCreate.popularJTable(cadastroDAO.getCadastro(), 1);
JTableButtonColumn jTableButtonColumn = new JTableButtonColumn(jTableCreate,2);
.............
Fiz um teste utilizando o modelo Default da Table e funcionou, pode ser problema no meu modelo, mas não consegui achar o que seria. :shock: