# 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:
Post a Comment