Ờ, sau mấy tuần làm project Java vừa qua, mình có một vài kinh nghiệm muốn chia sẻ cho các bạn nào sắp tới phải đối mặt với việc làm project đầu tay này.
- Kinh nghiệm dùng IDE.
- Lấy dữ liệu từ database đưa vào JTable.
- Cập nhật JTable.
- Đổi ngôn ngữ trong Swing.
- Validate ngày tháng. (chưa hoàn thành)
IDE
Về IDE thì mình nghĩ tốt nhất các bạn nên viết bằng NetBeans, mà NetBeans 6.0 là hơn hết. Với NetBeans các bạn có thể nhanh chóng tạo những form phức tạp. Mà các bạn hay làm quen với việc xây dựng project đi, vừa dễ quản lý mà lại dễ có điểm phần kỹ năng.
netBeans có thể tải về từ http://www.netbeans.org/
Database to JTable
Rất nhanh chóng để tạo 1 ResultSet từ câu lệnh SQL. Vấn đề nhiều người gặp phải là chuyển từ ResultSet sang table. Mà ResultSet lại không có method nào làm chuyện này cả. Muốn như vậy, bạn nên dùng contructor JTable(Vector rowData, Vector columnName). Cụ thể:
public JTable toTable() {
JTable result = null;
try {
col = new Vector();
rowData = new Vector();
//add columnName
for(int i=0;i<header.length;i++) {
col.add(header[i]);
}
//Add rows data
while(rs.next()){
Vector v = new Vector();
v.add(rs.getInt(1));
v.add(rs.getString(2));
v.add(rs.getDate(3));
rowData.add(v);
}
model = new DefaultTableModel(rowData,col);
result = new JTable(model);
if(con!=null) con.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
return result;
}
Ở đây header
là 1 mảng String[]
chứa tên của các cột. rs
là ResultSet
vừa tạo bằng câu lệnh SQL với bảng giá trị gồm 3 cột (số thứ tự, tên, ngày sinh chẳng hạn).
Bạn nên đưa nó vào một class mới. Cho nó extends JTable
hoặc là ResultSet
cũng được.
Update JTable
Muốn Update một JTable
với các dòng dữ liệu mới, các cột mới, hay nói chung là 1 tableModel
mới, bạn cần đặt hàm table.repaint()
trong tableChanged(TableModelEvent e)
. Mà hàm này nằm trong interface TableModelListener
. Nó được kích hoạt khi table nào đó được setModel
mới. Vì vậy ta cần thực hiện như sau:
public class yourClassName extends JFrame implements TableModelListener {
...
JTable table;
void methodBấtKỳ() {
...
table = new JTable(modelMặcĐịnh);
table.setModel(mộtModelMới);
...
}
public void tableChanged(TableModelEvent e) {
table.repaint();
}
...
}
Khi mà hàm setModel
được gọi cho table
thì sự kiện tableChanged
được kích hoạt, vì thế mà hàm repaint()
cũng được gọi theo.
Multi-language inteface
Để thực hiện chức năng đa ngôn ngữ trong Swing. Bạn chỉ cần dùng method setText() cho các Component như button, label... Với cái List hay Choice, bạn cần removeAll() và add lại mảng nội dung mới. Với JTable, bạn có thể tạo một Table Model mới đã cập nhật tên cột và nội dung, rồi setModel đó vào table cần chuyển ngữ.
Vì lý do cần phải thay đổi nhiều, bạn nên tạo các mảng String[] cho từng nhóm Component, chứa lần lượt các text của Component dó. Tốt nhất bạn nên dựng 1 abstract class mới chứa các mảng String[] đó. Và các class ngôn ngữ con extends class abstract này. Trong các class con ta sẽ truyền chuỗi thật vào. Ví dụ:
abstract public class Language {
String title;
String[] btn,lbl;
Language() {}
}
class english extends Language {
String title = "Personal Information Manager";
String[] btn ={
"Exit","Cancel","New","Save","Edit","Delete"
};
String[] lbl = {
"Full Name:","Nickname:","Job:","Birthday:"
};
public english() {
super();
super.btn = this.btn;
super.lbl = this.lbl;
super.title = this.title;
}
}
class vietnamese extends Language {
String title = "Quản lý danh bạ cá nhân";
String[] btn ={
"Thoát","Hủy bỏ","Tạo mới","Lưu","Chỉnh sửa","Xóa
};
String[] lbl = {
"Họ tên:","Biệt danh:","Nghề nghiệp:","Ngày sinh:"
};
public vietnamese() {
super();
super.btn = this.btn;
super.lbl = this.lbl;
super.title = this.title;
}
}
Trong class chính, bạn tạo 1 đối tượng Language lan;. Tùy vào action mà bạn sắp đặt, bạn gọi hàm assignLabel(int ind) đã dựng ra. Hàm assignLabel(int ind) có dạng như sau:
Language lan; //Tạo đối tượng abstract
...
void assignLabel(int ind) {
switch(ind) {
case 0: lan = new english(); break;
case 1: lan = new vietnamese(); break;
case 2: lan = new french(); break;
}
//Button
for(int i =0;i<lan.btn.length;i++) {
btn[i].setText(lan.btn[i]);
}
//Label
for(int i=0;i<lan.lbl.length;i++) {
lbl[i].setText(lan.lbl[i]);
}
//Title
this.setTitle(lan.title);
}
Chú ý: Nếu bạn có nhiều component thì hơn hết bạn nên đưa chúng vào từng mảng. Ví dụ:
JButton[] btn = new JButton[9];
public initComponent() {
for(int i=0;i<btn.length;i++)
btn[i] = new JButton();
}
Cũng đơn giản phải không bạn. NẾu bạn không thực hiện được theo hướng dẫn này, vui lòng comment hoặc email tới gmanvn@gmail.com. Cám ơn.
No comments:
Post a Comment