Java - Add Remove Buttons to JTable Rows

How to Create a JTable with Delete Button In Java Netbeans





In this Java Tutorial we will see How To Create a JTable with a custom "Remove" button in each row In Java Using Netbeans.

What We Are Gonna Use In This Project:

- Java Programming Language.
- NetBeans Editor.





Project Source Code:


package new_tutorials;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

/**
 *
 * @author 1BestCsharp
 */
public class JTableWithRemoveButton {

    public static void main(String[] args) {
        
        JFrame frame = new JFrame("JTable With Remove Button");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600,400);
        frame.setLocationRelativeTo(null);
        
        JTable table = createTable();
        table.setShowHorizontalLines(true);
        table.setShowVerticalLines(true);
        JScrollPane scrollPane = new JScrollPane(table);
        
        frame.add(scrollPane);
        frame.setVisible(true);
        
    }
    
    // create and customize a jtable
    private static JTable createTable(){
        // Define column names and sample data
        String[] columnNames = {"Name","Age","Remove"};
        Object[][] data = {
                {"John", 30, "Remove"},
                {"Jane", 25, "Remove"},
                {"Michael", 35, "Remove"},
                {"Emily", 28, "Remove"}
        };
        
        DefaultTableModel model = new DefaultTableModel(data,columnNames){
            /*@Override
            public boolean isCellEditable(int row, int column){
                return column == 2;
            }*/
        };
        
        // Create a JTable and customize its appearance and behavior
        JTable table = new JTable(model);
        table.setRowHeight(40);
        table.setForeground(Color.DARK_GRAY);
        table.setFont(new Font("Arial",Font.PLAIN,18));
        table.getTableHeader().setFont(new Font("Arial",Font.PLAIN,20));
        table.setDefaultRenderer(Object.class, new CenteredTableCellRenderer());
        table.getColumnModel().getColumn(2).setCellRenderer(new ButtonRenderer());
        table.getColumnModel().getColumn(2).setCellEditor(new ButtonEditor(table));
        
        
        return table;
        
    }
    
    // Create a custom TableCellRenderer for centering text in cells
    static class CenteredTableCellRenderer extends DefaultTableCellRenderer{
        
        public CenteredTableCellRenderer(){
            setHorizontalAlignment(JLabel.CENTER);
        }
        
    }
    
    // Create a custom TableCellRenderer for rendering buttons in cells
    static class ButtonRenderer extends JButton implements TableCellRenderer{

        public ButtonRenderer(){
            setOpaque(true);
            setForeground(Color.WHITE);
            setBackground(new Color(255,87,34));
        }
        
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
          
            setText((value == null) ? "" : value.toString());
            return this;
            
        }
        
    }
    
    
    // Create a custom TableCellEditor for handling button clicks and removing rows
    static class ButtonEditor extends DefaultCellEditor{
        protected JButton button;
        private String label;
        private final JTable vTable;

        public ButtonEditor(JTable table) {
            super(new JCheckBox());
            this.vTable = table;
            button = new JButton();
            button.setOpaque(true);
            
            button.addActionListener((e) -> {
               
                // remove row
                fireEditingStopped();
                int selectedRow = table.getSelectedRow();
                if(selectedRow != -1){
                    ((DefaultTableModel) vTable.getModel()).removeRow(selectedRow);
                }
                
            });
            
        }
        
         @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
          
           label = (value == null) ? "" : value.toString();
           button.setText(label);
           return button;
            
        }
                
    }
    
}



The Final Result: