Tuesday, July 22, 2025

Java JTable Add Edit Read Delete

# Learning JTable in Java for CRUD Operations (Add, Edit, Delete)

JTable is a powerful Swing component for displaying and editing tabular data. Here's a comprehensive guide to implementing CRUD (Create, Read, Update, Delete) operations with JTable.

## Basic JTable with CRUD Operations

```java
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JTableCRUDExample extends JFrame {
    private DefaultTableModel model;
    private JTable table;
    private JTextField nameField, ageField, emailField;

    public JTableCRUDExample() {
        setTitle("JTable CRUD Example");
        setSize(600, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        // Create table model with column names
        String[] columns = {"Name", "Age", "Email"};
        model = new DefaultTableModel(columns, 0);
        
        // Create JTable with the model
        table = new JTable(model);
        JScrollPane scrollPane = new JScrollPane(table);
        
        // Create input fields
        nameField = new JTextField(15);
        ageField = new JTextField(15);
        emailField = new JTextField(15);
        
        // Create buttons
        JButton addButton = new JButton("Add");
        JButton editButton = new JButton("Edit");
        JButton deleteButton = new JButton("Delete");
        JButton clearButton = new JButton("Clear");
        
        // Panel for input fields
        JPanel inputPanel = new JPanel(new GridLayout(3, 2, 5, 5));
        inputPanel.add(new JLabel("Name:"));
        inputPanel.add(nameField);
        inputPanel.add(new JLabel("Age:"));
        inputPanel.add(ageField);
        inputPanel.add(new JLabel("Email:"));
        inputPanel.add(emailField);
        
        // Panel for buttons
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));
        buttonPanel.add(addButton);
        buttonPanel.add(editButton);
        buttonPanel.add(deleteButton);
        buttonPanel.add(clearButton);
        
        // Main layout
        setLayout(new BorderLayout());
        add(inputPanel, BorderLayout.NORTH);
        add(scrollPane, BorderLayout.CENTER);
        add(buttonPanel, BorderLayout.SOUTH);
        
        // Add button action
        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String name = nameField.getText();
                String age = ageField.getText();
                String email = emailField.getText();
                
                if (!name.isEmpty() && !age.isEmpty() && !email.isEmpty()) {
                    model.addRow(new Object[]{name, age, email});
                    clearFields();
                } else {
                    JOptionPane.showMessageDialog(JTableCRUDExample.this, 
                            "Please fill all fields", "Error", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
        
        // Edit button action
        editButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int selectedRow = table.getSelectedRow();
                
                if (selectedRow != -1) {
                    String name = nameField.getText();
                    String age = ageField.getText();
                    String email = emailField.getText();
                    
                    if (!name.isEmpty() && !age.isEmpty() && !email.isEmpty()) {
                        model.setValueAt(name, selectedRow, 0);
                        model.setValueAt(age, selectedRow, 1);
                        model.setValueAt(email, selectedRow, 2);
                        clearFields();
                    } else {
                        JOptionPane.showMessageDialog(JTableCRUDExample.this, 
                                "Please fill all fields", "Error", JOptionPane.ERROR_MESSAGE);
                    }
                } else {
                    JOptionPane.showMessageDialog(JTableCRUDExample.this, 
                            "Please select a row to edit", "Error", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
        
        // Delete button action
        deleteButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int selectedRow = table.getSelectedRow();
                
                if (selectedRow != -1) {
                    model.removeRow(selectedRow);
                    clearFields();
                } else {
                    JOptionPane.showMessageDialog(JTableCRUDExample.this, 
                            "Please select a row to delete", "Error", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
        
        // Clear button action
        clearButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                clearFields();
            }
        });
        
        // Table selection listener to populate fields when row is selected
        table.getSelectionModel().addListSelectionListener(e -> {
            int selectedRow = table.getSelectedRow();
            
            if (selectedRow != -1) {
                nameField.setText(model.getValueAt(selectedRow, 0).toString());
                ageField.setText(model.getValueAt(selectedRow, 1).toString());
                emailField.setText(model.getValueAt(selectedRow, 2).toString());
            }
        });
    }
    
    private void clearFields() {
        nameField.setText("");
        ageField.setText("");
        emailField.setText("");
        table.clearSelection();
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new JTableCRUDExample().setVisible(true);
        });
    }
}
```

## Key Concepts Explained

### 1. DefaultTableModel
- The `DefaultTableModel` class provides the data structure for JTable
- It handles adding, editing, and deleting rows
- `addRow()` - Adds a new row to the table
- `removeRow()` - Deletes a row from the table
- `setValueAt()` - Edits a specific cell value

### 2. JTable Components
- `JTable` displays the data
- `JScrollPane` makes the table scrollable when there are many rows

### 3. CRUD Operations
- **Create (Add)**: Collect data from input fields and add as new row
- **Read**: Data is automatically displayed in the table
- **Update (Edit)**: Modify selected row with new values
- **Delete**: Remove the selected row

### 4. Event Handling
- Action listeners for buttons to perform operations
- List selection listener to populate fields when row is selected

## Advanced Features to Consider

### 1. Data Validation
```java
// In the add button action listener
try {
    int age = Integer.parseInt(ageField.getText());
    if (age < 0 || age > 120) {
        throw new NumberFormatException();
    }
    // Add row if validation passes
} catch (NumberFormatException ex) {
    JOptionPane.showMessageDialog(this, "Please enter a valid age (0-120)", 
            "Error", JOptionPane.ERROR_MESSAGE);
}
```

### 2. Custom TableModel
For more control, create a custom TableModel:

```java
class PersonTableModel extends AbstractTableModel {
    private List<Person> persons;
    private String[] columns = {"Name", "Age", "Email"};
    
    // Implement required methods: getRowCount, getColumnCount, getValueAt
    // Plus setValueAt for editing, isCellEditable, etc.
}
```

### 3. Cell Editors and Renderers
Customize how cells are displayed and edited:

```java
// Set a custom editor for age column to only allow numbers
table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(
    new JTextField() {
        @Override
        public void setText(String text) {
            if (text.matches("\\d*")) {
                super.setText(text);
            }
        }
    }
));
```

### 4. Sorting
Enable table sorting:

```java
table.setAutoCreateRowSorter(true);
```

### 5. Saving/Loading Data
Add functionality to save to/load from file:

```java
// Save to CSV
JButton saveButton = new JButton("Save");
saveButton.addActionListener(e -> {
    try (PrintWriter writer = new PrintWriter(new File("data.csv"))) {
        for (int row = 0; row < model.getRowCount(); row++) {
            writer.println(model.getValueAt(row, 0) + "," + 
                          model.getValueAt(row, 1) + "," + 
                          model.getValueAt(row, 2));
        }
    } catch (FileNotFoundException ex) {
        ex.printStackTrace();
    }
});
```

This comprehensive example covers all basic CRUD operations with JTable. You can extend it with more advanced features as needed for your specific application.

No comments: