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