Botão em jTable (AbstractTableModel)
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 botap 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
jdialogTest.java
ButtonColumn.java
TesteBean.java
Agradeço desde ja.
Abraço
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 botap 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
Renato Chinaglia
Curtidas 0
Respostas
Sérgio Júnior
03/01/2013
Você precisa sobrescrever o método isCellEditable
public boolean isCellEditable(int rowIndex, int columnIndex) {
if (columnIndex == numerodacolunaasereditavel) {
return true;
} else {
return false;
}
}GOSTEI 0