Hi guys, i'm not sure if my subject is clear, but i have a jtable with couple of rows. In each row, there's a delete button that delete the current row. The event works correctly when I push the delete button BUT when I refresh the table (handled when the button is pushed) i got an ArrayIndexOutOfBoundsException..
Here's 3 classes that reproduce the problem... The buttonRenderer and Editor was taken from the internet.
/*********************************************
* DEMOJFrame Class
*********************************************/
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class DEMOJFrame extends JFrame
{
private JTable table;
private JScrollPane scrollPane;
private JPanel jpanel = new JPanel();
private DefaultTableModel tableModel;
private String[] columnNames = {"Remove",
"col1",
"col2"};
public DEMOJFrame()
{
Container ct = this.getContentPane();
ct.setLayout( new BorderLayout() );
ct.add(jpanel,BorderLayout.CENTER);
Object[][] data = {{"", "","",}};
tableModel = new DefaultTableModel(data, columnNames);
table = new JTable(tableModel);
tableModel.removeRow(0);
table.setPreferredScrollableViewportSize(new Dimension(300, 100));
//Create the scroll pane and add the table to it.
scrollPane = new JScrollPane(table);
//Add the scroll pane to this panel.
jpanel.add(scrollPane);
Toolkit tk = this.getToolkit();
Dimension dim = tk.getScreenSize();
int ScreenWidth = dim.width;
int ScreenHeight = dim.height;
//Add rows
for(int i=0;i<3;i++)
{
Object[] row = {"Remove","col1","col2"};
tableModel.addRow(row);
ButtonEditor buttonEditorSupprimer = new ButtonEditor(new JCheckBox());
table.getColumn("Remove").setCellRenderer(new ButtonRenderer());
table.getColumn("Remove").setCellEditor(buttonEditorSupprimer);
}
table.getColumn("Remove").setPreferredWidth(65);
this.setBounds((ScreenWidth-500)/2 ,
(ScreenHeight-500)/2,500,500);
this.setVisible( true );
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new DEMOJFrame();
}
}
/*********************************************
* ButtonRenderer Class
*********************************************/
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
/**
*
* @author r�f�rence : Inspir� de http://www.esus.com/docs/GetQuestionPage.jsp?uid=1285
*
*/
public class ButtonRenderer extends JButton implements TableCellRenderer {
public ButtonRenderer()
{
setOpaque(true);
}
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;
}
}
/*********************************************
* ButtonEditor Class
*********************************************/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
/**
*
* @author r�f�rence : Inspir� de http://www.esus.com/docs/GetQuestionPage.jsp?uid=1285
*
*/
public class ButtonEditor extends DefaultCellEditor implements ActionListener {
protected JButton button;
private JTable table = new JTable();
private String label;
private int row;
private int col;
private boolean isPushed;
public ButtonEditor(JCheckBox checkBox)
{
super(checkBox);
button = new JButton();
button.setOpaque(true);
button.addActionListener(this);
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column)
{
if (isSelected)
{
button.setForeground(table.getSelectionForeground());
button.setBackground(table.getSelectionBackground());
}
else
{
button.setForeground(table.getForeground());
button.setBackground(table.getBackground());
}
label = (value ==null) ? "" : value.toString();
button.setText( label );
isPushed = true;
this.row = row;
this.col = column;
this.table = table;
return button;
}
public Object getCellEditorValue()
{
if (isPushed)
{
System.out.println("Pushed");
DefaultTableModel defaultTableModel = new DefaultTableModel();
table.setModel(defaultTableModel);
defaultTableModel.removeRow(row);
}
isPushed = false;
return new String( label ) ;
}
public boolean stopCellEditing()
{
isPushed = false;
return super.stopCellEditing();
}
protected void fireEditingStopped()
{
super.fireEditingStopped();
}
public void actionPerformed(ActionEvent e)
{
// TODO Auto-generated method stub
fireEditingStopped();
}
}
I'm sure this feature was already implemented, so if you have an idea please let me know.
Thans