Kinh nghiệm Java Swing

Ờ, 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.

  1. Kinh nghiệm dùng IDE.
  2. Lấy dữ liệu từ database đưa vào JTable.
  3. Cập nhật JTable.
  4. Đổi ngôn ngữ trong Swing.
  5. 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. rsResultSet 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

You can use some HTML tags, such as <b>, <i>, <a>