Java GUI Delete Multiple Records using JTable/Checkbox |
Java GUI Delete Multiple Records using JTable/Checkbox บทความนี้จะเป็นตัวอย่างการเขียน Java GUI เพื่อลบข้อมูลครั้งล่ะหลายรายการ โดยจะออกแบบ JTable ให้ดึงข้อมูลจาก Database พร้อมกับสร้าง Checkbox ให้สามารถเลือกรายการของแถวได้ครั้งล่ะหลาย ๆ รายการ และสามารถลบรายการที่เลือกออกจาก Database
Java GUI Delete Multiple Records using Checkbox
ในตัวอย่างนี้จะเลือกใช้ Database ของ MySQL แต่ในกรณีที่จะใช้ร่วมกับ Database อื่น ๆ ก็สามารถทำได้ง่าย ๆ เพียงแค่เปลี่ยน Connector และ Connection String เท่านั้น และการแสดงข้อมูลจะใช้ JTable ของ Java Swing สามารถอ่านเพิ่มเติมได้ที่บทความนี้
Java Connect to MySQL Database (JDBC)
Java Table (JTable) - Swing Example
Java GUI Retrieve List Data from Database
โครงสร้างของ MySQL และ Table
CREATE TABLE `customer` (
`CustomerID` varchar(4) NOT NULL,
`Name` varchar(50) NOT NULL,
`Email` varchar(50) NOT NULL,
`CountryCode` varchar(2) NOT NULL,
`Budget` double NOT NULL,
`Used` double NOT NULL,
PRIMARY KEY (`CustomerID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- dump ตาราง `customer`
--
INSERT INTO `customer` VALUES ('C001', 'Win Weerachai', '[email protected]', 'TH', 1000000, 600000);
INSERT INTO `customer` VALUES ('C002', 'John Smith', '[email protected]', 'UK', 2000000, 800000);
INSERT INTO `customer` VALUES ('C003', 'Jame Born', '[email protected]', 'US', 3000000, 600000);
INSERT INTO `customer` VALUES ('C004', 'Chalee Angel', '[email protected]', 'US', 4000000, 100000);
คำสั่ง SQL ที่สามารถนำไปรันบน Query เพื่อสร้าง Table และ Data ได้ทันที
กลับมายัง Java Project ออกแบบ Frame สำหรับ Delete ข้อมูลหลายรายการโดยใช้ JTable
สร้าง JTable และ Button สำหรับ Delete ข้อมูล
DefaultTableModel model = new DefaultTableModel() {
public Class<?> getColumnClass(int column) {
switch (column) {
case 0:
return Boolean.class;
case 1:
return String.class;
case 2:
return String.class;
case 3:
return String.class;
case 4:
return String.class;
case 5:
return String.class;
case 6:
return String.class;
default:
return String.class;
}
}
};
table.setModel(model);
จาก Code เป็นการสร้าง Model สำหรับ JTable สังเกตุว่า Column แรกเป็น Boolean.class ซึ่งจะได้ Checkbox สำหรับเลือกเพื่อลบข้อมูล
เขียน Code ทั้งหมดดังนี้
MyForm.java
package com.java.myapp;
import java.awt.EventQueue;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class MyForm extends JFrame {
static JTable table;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
MyForm frame = new MyForm();
frame.setVisible(true);
}
});
}
/**
* Create the frame.
*/
public MyForm() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 516, 319);
setTitle("ThaiCreate.Com Java GUI Tutorial");
getContentPane().setLayout(null);
// Customer List
JLabel lblCustomerList = new JLabel("Customer List");
lblCustomerList.setBounds(207, 44, 87, 14);
getContentPane().add(lblCustomerList);
// ScrollPane
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(28, 84, 440, 89);
getContentPane().add(scrollPane);
// Table
table = new JTable();
scrollPane.setViewportView(table);
// Button Delete
JButton btnDelete = new JButton("Delete");
btnDelete.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Object[] options = { "Yes", "No" };
int n = JOptionPane
.showOptionDialog(null, "Do you want to Delete data?",
"Confirm to Delete?",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null, options,
options[1]);
if (n == 0) // Confirm Delete = Yes
{
for (int i = 0; i < table.getRowCount(); i++) {
Boolean chkDel = Boolean.valueOf(table.getValueAt(i, 0).toString()); // Checked
if(chkDel) // Checked to Delete
{
String strCustomerID = table.getValueAt(i, 1)
.toString(); // get CustomerID
DeleteData(strCustomerID); // Delete Data
}
}
JOptionPane.showMessageDialog(null, "Delete Data Successfully");
PopulateData(); // Reload Table
}
}
});
btnDelete.setBounds(205, 202, 89, 23);
getContentPane().add(btnDelete);
PopulateData();
}
private static void PopulateData() {
// Clear table
table.setModel(new DefaultTableModel());
// Model for Table
DefaultTableModel model = new DefaultTableModel() {
public Class<?> getColumnClass(int column) {
switch (column) {
case 0:
return Boolean.class;
case 1:
return String.class;
case 2:
return String.class;
case 3:
return String.class;
case 4:
return String.class;
case 5:
return String.class;
case 6:
return String.class;
default:
return String.class;
}
}
};
table.setModel(model);
// Add Column
model.addColumn("Select");
model.addColumn("CustomerID");
model.addColumn("Name");
model.addColumn("Email");
model.addColumn("CountryCode");
model.addColumn("Budget");
model.addColumn("Used");
Connection connect = null;
Statement s = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connect = DriverManager
.getConnection("jdbc:mysql://localhost/mydatabase"
+ "?user=root&password=root");
s = connect.createStatement();
String sql = "SELECT * FROM customer ORDER BY CustomerID ASC";
ResultSet rec = s.executeQuery(sql);
int row = 0;
while ((rec != null) && (rec.next())) {
model.addRow(new Object[0]);
model.setValueAt(false, row, 0); // Checkbox
model.setValueAt(rec.getString("CustomerID"), row, 1);
model.setValueAt(rec.getString("Name"), row, 2);
model.setValueAt(rec.getString("Email"), row, 3);
model.setValueAt(rec.getString("CountryCode"), row, 4);
model.setValueAt(rec.getFloat("Budget"), row, 5);
model.setValueAt(rec.getFloat("Used"), row, 6);
row++;
}
} catch (Exception e) {
// TODO Auto-generated catch block
JOptionPane.showMessageDialog(null, e.getMessage());
e.printStackTrace();
}
try {
if (s != null) {
s.close();
connect.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Delete
private void DeleteData(String strCustomerID) {
Connection connect = null;
Statement s = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connect = DriverManager
.getConnection("jdbc:mysql://localhost/mydatabase"
+ "?user=root&password=root");
s = connect.createStatement();
String sql = "DELETE FROM customer WHERE " + "CustomerID = '"
+ strCustomerID + "' ";
s.execute(sql);
} catch (Exception e) {
// TODO Auto-generated catch block
JOptionPane.showMessageDialog(null, e.getMessage());
e.printStackTrace();
}
try {
if (s != null) {
s.close();
connect.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
Output
Column แรกจะเป็น Checkbox สำหรับเลือกรายการเพื่อลบข้อมูล
ทดสอบเลือกรายการที่จะลบเพื่อ Delete
ปุ่ม Confirm Dialog เพื่อยืนยันการลบข้อมูล
ลบข้อมูลเรียบร้อย
ข้อมูลจะหายไปจาก JTable เพราะหลังจากลบเรียบร้อยแล้วมีการ Reload Data 1 ครั้ง
เมื่อกลับไปดูใน Database ข้อมูลก็จะถูกลบออกไปจาก Database
กรณีที่ใช้ร่วมกับ Database อื่น ๆ สามารถดูวิธีการใช้ Connector และ Connection String ได้ที่นี่
Property & Method (Others Related) |
|