Lập trình Java Swing theo cách "nhà quê" ...
Bắt đầu viết ứng dụng bằng việc xem xét các yêu cầu. Theo cá nhân, đây là ứng dụng thuộc dạng đơn giản - xét về mặt business logic - các thao tác chỉ xoay quanh thêm, xóa, copy, move ... trên file/thư mục.
Ứng dụng sẽ viết theo MVC, với View là file tạo giao diện Swing, Controller là nơi xử lý các sự kiện, load data cho component, ... và Model là object lo việc thao tác file.
┌——————————————————————————————┐ ┌——————————————————————————————┐ │ VIEW │————————►│ CONTROLLER │ ├——————————————————————————————┤ ├——————————————————————————————┤ │ │◄————————│ │ └——————————————————————————————┘ └——————————————————————————————┘ │ │ │ │ ▼ ▼ ┌——————————————————————————————┐ │ MODEL │ ├——————————————————————————————┤ │ │ └——————————————————————————————┘
Java Swing viết theo MVC, do đó, áp dụng cho ứng dụng này cũng tương đối dễ dàng! Việc đầu tiên là viết code cho Model. Hình dung một cách đơn giản nhất thì cần một object chứa thông tin file (tên, loại, kích thước, thuộc tính, ngày modify ...). Lúc này, cần viết một lớp Util (Helper) dùng cho việc access file, để dễ sử dụng, nên viết dưới dạng static. Có thể dễ dàng thấy rằng đây là lớp quan trọng nhất của ứng dụng !
Ngoài lề 1 chút nhé ...
Gần đây, trong giới software engineering rộ lên phong trào unittest, nhà nhà unittest, người người unittest ... Bản thân cũng có lúc đọc một chút về unittest, agile cho .. dễ ngủ, chứ còn hiểu thì ... Những quyển sách này giới thiệu rất nhiều ưu điểm của unittest, và thực sự là chưa từng thử qua với project cụ thể nào nên những ưu điểm trên chỉ đọc để biết. Khi bắt đầu ứng dụng này bằng cách viết FileUtil , tui đã dùng unittest, nhưng chỉ với mục đích rất nhà quê là khỏi mất công viết hàm main :)). IDE NetBeans hỗ trợ JUnit khá tốt, bản mới chỉ cần để Annotation @Test trước method là nó chạy thui. Ban đầu, viết mấy cái method list file ngay trong class JUnit luôn, sau đó mới tách ra làm object riêng, sau khi test ok thì lấy source code đó vào chương trình luôn! Đọc trong sách bảo rằng dùng unittest để design chắc là vậy, nhưng ở mức first test thì chưa được, thấy vẫn thích viết ra cái gì cụ thể để chạy (test), hơn là viết cái khung sử dụng object trước :((
Sau khi viết vài method static cho FileUtil , test ok, thì chuyển qua design giao diện Swing. Cảm giác về Swing là nó không khó lắm, cách quản lý layout rất hay, và design theo MVC, nếu hiểu về Swing một chút thì viết code để design còn nhanh hơn là drag'n'drop của NetBeans. Tuy nhiên có cái không hiểu khi code là sao có cái method setSize, còn có cái setPreferredSize, chắc do chưa hiểu sâu về cách Swing paint các thành phần. Vậy là code vài dòng cũng ra cái GUI như ai, he he
public void initGUI() {
this.setSize(800, 600);
menu = new JMenuBar();
itemFile = new JMenuItem("File");
menu.add(itemFile);
this.setJMenuBar(menu);
this.setLayout(new BorderLayout());
barTop = new JToolBar();
barTop.setPreferredSize(new java.awt.Dimension(0, 30));
add(BorderLayout.NORTH, barTop);
splCenter = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JTabbedPane(), new JTabbedPane());
splCenter.setDividerLocation(this.getWidth() / 2);
add(BorderLayout.CENTER, splCenter);
barBottom = new JToolBar();
barBottom.setPreferredSize(new java.awt.Dimension(0, 30));
add(BorderLayout.SOUTH, barBottom);
}
Mấy dòng mà ra cái gui handmake , he he
Trở lại cái mô hình MVC, làm sao để implement nó trong ứng dụng này? Thế là sau cái gui được coi như view, lại sinh ra 2 cái class khác là controller và model với quan hệ giống như hình ở trên, xác lập mối quan hệ qua hàm main luôn ! Với mô hình của Swing, controller implements các interface event của Swing để xử lý trên đó, model thì extends một TableModel, do sẽ hiển thị data lên JTable (với các control khác cũng có model tương ứng!).
Viết tới đây thôi, hôm nay mệt quá, chắc tuần sau mới tiếp được, đang code Java giờ nhảy qua code PHP cho xogn cái đồ án ...
To be continue ...