Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Cannot remove a row in jtable from a jbutton into the same row

843805Mar 15 2007 — edited Mar 15 2007
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
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Apr 12 2007
Added on Mar 15 2007
2 comments
96 views