joepa37
joepa37

Reputation: 23

How to add delete action to each row taking the value id

So, I am having problems adding a action to each row to delete the selected row taking the id from the Values column because Delete column has - in all cells.

enter image description here

I have the ButtonRenderer and ButtonEditor to add button to the JTable

ButtonRenderer

import java.awt.Component;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;
/**
*
* @author joepa37
*/
public class ButtonRenderer extends JButton implements TableCellRenderer {
public ButtonRenderer() {
setOpaque(true);
}

 @Override
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

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
import javax.swing.JTable;
/**
 *
 * @author joepa37
 */
public class ButtonEditor extends DefaultCellEditor {
  protected JButton button;
  private String label;
  private boolean isPushed;
  public ButtonEditor(JCheckBox checkBox) {
  super(checkBox);
  button = new JButton();
  button.setOpaque(true);
  button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
      fireEditingStopped();
    }
  });
}
 @Override
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;
return button;
 }
 @Override
public Object getCellEditorValue() {
if (isPushed) {
  // 
  // 
  JOptionPane.showMessageDialog(button, label + ": Ouch!");
  // System.out.println(label + ": Ouch!");
}
isPushed = false;
return new String(label);
 }
@Override
public boolean stopCellEditing() {
isPushed = false;
return super.stopCellEditing();
}
@Override
protected void fireEditingStopped() {
super.fireEditingStopped();
}
}

And my table is here

import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
/**
 *
 * @author joepa37
 */
public class deleteRowTable extends JFrame{
public deleteRowTable(){
    super();

    this.add(getPreview());

    setSize(500,500);
    setVisible(true);
}

public static void main(String args[]){
    new deleteRowTable();
}

public Component getPreview ()
{
    // Table
    JTable table = new JTable ( new ExampleTableModel () );
    JScrollPane scrollPane = new JScrollPane ( table );

    // Custom column
    TableColumn buttonColumn = table.getColumnModel ().getColumn ( 0 );

    // Custom renderer
    buttonColumn.setCellRenderer(new ButtonRenderer());

    // Custom editor
    buttonColumn.setCellEditor(new ButtonEditor(new JCheckBox()));

    return scrollPane;
}

public class ExampleTableModel extends AbstractTableModel
{
    private String[] columnNames = { "Delete", "Values"};
    private Object[][] data = { { "-", "id1"}, 
                                { "-", "id2"}, 
                                { "-", "id3"},
                                { "-", "id4"}, 
                                { "-", "id"} 
                            };

    public final Object[] longValues = { "-", "Value"};

    @Override
    public int getColumnCount ()
    {
        return columnNames.length;
    }

    @Override
    public int getRowCount ()
    {
        return data.length;
    }

    @Override
    public String getColumnName ( int col )
    {
        return columnNames[ col ];
    }

    @Override
    public Object getValueAt ( int row, int col )
    {
        return data[ row ][ col ];
    }

    @Override
    public Class getColumnClass ( int c )
    {
        return longValues[ c ].getClass ();
    }

    @Override
    public boolean isCellEditable ( int row, int col )
    {
        return true;
    }

    @Override
    public void setValueAt ( Object value, int row, int col )
    {
        data[ row ][ col ] = value;
        fireTableCellUpdated ( row, col );
    }
}
}

Upvotes: 2

Views: 1328

Answers (1)

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285405

You can get the row number from within your editor. One way is via:

class ButtonEditor extends DefaultCellEditor {
   protected JButton button;
   private String label;
   private boolean isPushed;
   private int myRow;  // *******added **********

   public ButtonEditor(JCheckBox checkBox) {
      // ..............
   }

   @Override
   public Component getTableCellEditorComponent(JTable table, Object value,
         boolean isSelected, int row, int column) {
      this.myRow = row;  // *******added **********
      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;
      return button;
   }

   @Override
   public Object getCellEditorValue() {
      if (isPushed) {
         // can get the row number here
         JOptionPane.showMessageDialog(button, label + ": Ouch! " + myRow);
      }
      isPushed = false;
      return new String(label);
   }

Once you have the row number, then you can access any items on that row held by the model. You may need to convert from view to model if the rows have been sorted.


For example:

import java.awt.Component;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;


@SuppressWarnings("serial")
public class deleteRowTable extends JFrame {
   public deleteRowTable() {
      super();
      setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

      this.add(getPreview());

      setSize(500, 500);
      setVisible(true);
   }

   public static void main(String args[]) {
      new deleteRowTable();
   }

   public Component getPreview() {
      // Table
      JTable table = new JTable(new ExampleTableModel());
      JScrollPane scrollPane = new JScrollPane(table);

      // Custom column
      TableColumn buttonColumn = table.getColumnModel().getColumn(0);

      // Custom renderer
      buttonColumn.setCellRenderer(new ButtonRenderer());

      // Custom editor
      buttonColumn.setCellEditor(new ButtonEditor(new JCheckBox()));

      return scrollPane;
   }

   public class ExampleTableModel extends AbstractTableModel {
      private String[] columnNames = { "Delete", "Values" };
      private Object[][] data = { { "-", "id1" }, { "-", "id2" },
            { "-", "id3" }, { "-", "id4" }, { "-", "id" } };

      public final Object[] longValues = { "-", "Value" };

      @Override
      public int getColumnCount() {
         return columnNames.length;
      }

      @Override
      public int getRowCount() {
         return data.length;
      }

      @Override
      public String getColumnName(int col) {
         return columnNames[col];
      }

      @Override
      public Object getValueAt(int row, int col) {
         return data[row][col];
      }

      @Override
      public Class<?> getColumnClass(int c) {
         return longValues[c].getClass();
      }

      @Override
      public boolean isCellEditable(int row, int col) {
         return true;
      }

      @Override
      public void setValueAt(Object value, int row, int col) {
         data[row][col] = value;
         fireTableCellUpdated(row, col);
      }
   }
}

@SuppressWarnings("serial")
class ButtonEditor extends DefaultCellEditor {
   protected JButton button;
   private String label;
   private boolean isPushed;
   private int myRow;
   private JTable table;

   public ButtonEditor(JCheckBox checkBox) {
      super(checkBox);
      button = new JButton();
      button.setOpaque(true);
      button.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            fireEditingStopped();
         }
      });
   }

   @Override
   public Component getTableCellEditorComponent(JTable table, Object value,
         boolean isSelected, int row, int column) {
      this.myRow = row;
      this.table = table;
      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;
      return button;
   }

   @Override
   public Object getCellEditorValue() {
      if (isPushed) {

         deleteRowTable.ExampleTableModel model = (deleteRowTable.ExampleTableModel) table.getModel();
         String label = (String) model.getValueAt(myRow, 1);
         if (label != null) {
            JOptionPane.showMessageDialog(button, "This is your label: " + label);
            // delete the model's row here if desired.
         }
      }
      isPushed = false;
      return new String(label);
   }

   @Override
   public boolean stopCellEditing() {
      isPushed = false;
      return super.stopCellEditing();
   }

   @Override
   protected void fireEditingStopped() {
      super.fireEditingStopped();
   }
}

@SuppressWarnings("serial")
class ButtonRenderer extends JButton implements TableCellRenderer {
   public ButtonRenderer() {
      setOpaque(true);
   }

   @Override
   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;
   }
}

Upvotes: 3

Related Questions