Mô phỏng máy tính bỏ túi
Mục tiêu của bài này giúp bạn biết sử dụng 3 đối tượng cơ bản của Swing components : Label, Panel, Button; làm quen với lập trình sự kiện trong Java dựa trên giao diện actionEvent và biết cách sử dụng bộ quản lý trình bày (layoutManagers) khi lập trình GUI trong Java.
Trước hết, bạn hãy tạo 1 project loại Java Desktop Application trong NetBean như hướng dẫn dưới đây.
Sau khi nhấn nút Finish, NetBean sẽ cung cấp cho bạn 1 chương trình với các thành phần cơ bản. Tại lớp view trong project của bạn sẽ có giao diện như hình sau

Xóa các thành phần không dùng đến như menuBar, statusPanel. Chỉ giữ lại mainPanel của FrameView.
(Lưu ý: Sau khi xóa các thành phần trong giao diện của lớp View, bạn phải chuyển vào mã lệnh của lớp này và xóa tất cả những dòng có báo lỗi trước khi tiến hành bước kế tiếp)
I – Xây dựng giao diện cho chương trình
Tiếp theo, tạo ra trên mainPanel 1 jLabel để hiển thị dữ liệu và 1 jPanel dùng để chứa và quản lý các nút chức năng của chương trình (Bao gồm các nút đại diện cho số, các nút tượng trưng cho các phép toán…). Giao diện với 2 thành phần chính như hình mô tả dưới đây.
Sử dụng LayoutManager
Đối với jPanel mà chúng ta vừa đưa vào, bạn hãy quy định sử dụng LayoutManager cho nó là Grid Layout bằng cách nhấn nút phải chuột vào jPanel có trong khung Inspector (Bên trái màn hình giao diện của netBean), sau đó chọn Set Layout -> Grid Layout. Hãy quan sát hình sau
Sau khi thiết lập Layout Manager để quản lý giao diện cho jPanel thì trong vùng Inspector bạn sẽ thấy phía dướijPanel có mô tả Layout được áp dụng cho jPanel của chúng ta là Grid Layout. Hình minh họa như sau.
Tiếp theo bạn quy định cho cấu trúc của GridLayout là 5 cột, 4 hàng bằng cách Click vào mục GridLayout có trong khung Inspector, sau đó trong khung Properties ở bên phải màn hình của NetBean bạn sẽ quy định thông qua mụcColumn và Row như hình dưới đây
Bước kế tiếp bạn sẽ dùng kỹ thuật DragMouse để kéo thả vào trong jPanel của mình các nút sẽ dùng trên giao diện (jButton – từ khung của sổ Palette)
Bạn cứ kéo thả vào jPanel số nút cần dùng trên giao diện, Layout Managers sẽ có tránh nhiệm sắp xếp và tổ chức các nút của bạn cho phù hợp với cấu hình của GridLauyout mà bạn đã quy định ở trên. Trong minh họa này, tôi đã kéo vào 20 nút và giao diện có dạng như sau
Cấu trúc logic của Swing Component trong giao diện lớp View của bạn sẽ có dạng như thế này
Đặt tên cho các thành phần trên giao diện
Đặt tên cho label dùng để hiển thị dữ liệu là “hienThi” bằng cách nhấn nút phải vào jLabel này và chọn lệnh “Change variable Name …”, cửa sổ Rename sẽ xuất hiện giống như hình dưới đây
Đặt tên biến cho các nút cũng tương tự như vậy: Nhấn nút phải chuột vào nút cần đặt tên, sau đó chọn “Change variable Name …”
Lúc này, cửa sổ cho phép bạn đặt tên biến sẽ xuất hiện và bạn chỉ cần đặt tên cho nó
Bạn hãy gõ vào tên của nút cần đặt, trong trường hợp này tôi đặt tên cho các nút tượng trưng cho các số từ 0 đến 9 lần lượt là so1, so2, … so0.
Tiếp tục với các nút chức năng lần lượt là chia, nhan, tru, cong, amDuong, reset, canB2, phanTram,nghichDao va bang
Như vậy, sau khi thiết kế xong, giao diện chương trình mô phỏng máy tính bỏ túi của bạn sẽ có giao diện như sau
II - Lập trình sự kiện cho các nút
Để chương trình của bạn có thể tương tác được với người dùng, bạn phải tiến hành lập trình sự kiện cho các nút để khi nhấn vào nút số, nút chức năng thì chương trình sẽ thực hiện cho đúng với nhu cầu của người dùng.
1/- Lập trình cho các nút số (0,1,2, … 9)
Để thể hiện số trên jLabel hienThi trong cửa sổ ứng dụng khi người dùng chọn số nào (nút nào) thì số đó sẽ xuất hiện trong jLabel. Chúng ta sẽ làm như sau
- Trỏ chuột vào nút số cần lập trình và nhấn nút phải, sau đó chọn Events -> Action -> actionPerformed . Các thao tác được mô tả như hình dưới đây
Lúc này, cửa sổ viết Code sẽ xuất hiện. Bạn hãy viết mã lệnh cho sự kiện của nút như sau (Trong đoạn code này, tôi đã chú thích để giải thích từng lệnh, bạn hãy đọc kỹ và suy diễn để hiểu tại sao phải viết như vậy)
Tương tự cho các nút số còn lại (từ 2,…9,0)
(Ghi chú: nếu bạn hiễu rõ về hàm trong java, bạn có thể viết 1 hàm để dùng chung cho tất cả các nút, như thế chương trình của bạn trông sẽ sáng sủa hơn, tôi chỉ dừng lại ở mức này – “hơi nông dân” một chút nhưng có thể bạn sẽ thấy đơn giản hơn)
2/- Lập trình cho các nút chức năng
A – Nút phục vụ cho việc nút đảo dấu đại số “+/-” : Bản chất của nút này là lấy giá trị số đã nhập đem nhân với -1. Code của nút này như sau
B – Nút “C” chính là nút cho phép “Reset” lại giá trị của jLabel hienThi, Mã lệnh cho nút này như sau
C – Các nút tương ứng với các phép toán cơ bản (+, -, *, /)
Về tương tác với người dùng, bạn có thể suy luận thế này: Khi người dùng nhấn vào các nút số để nhập vào số cần tính (Tại thời điểm này ta xem như họ nhập số thứ nhất), khi người dùng chọn phép toán chính là lúc bạn phải ghi nhận số đã nhập vào trong 1 biến đồng thời ghi nhận luôn phép toán mà người ta muốn thực hiện, sau đó bạn phải “Reset” lại giá trị trong jLabel hienThi để cho người dùng có thể tiến hành nhập tiếp giá trị của số thứ 2 có tham gia tính toán trong chương trình. Cho đến khi họ nhấn vào nút “=” thì chúng ta sẽ lấy giá trị thứ nhất (Đã ghi nhận) kế hợp với phép toán đã chọn cùng với số thứ 2 (Số đang có trên jLabel hienThi tại thời điểm tính toán) để tính và trả về kết quả trên màn hình. Với phân tích như thế, tôi đã khai báo ở mức toàn cục của lớp View 2 biến thành phần như sau
Và mã lệnh của các nút chức năng tượng trưng cho 4 phép toán cơ bản như thế này
Như vậy, sau khi nhấn chọn phép toán và nhập số thứ 2; người dùng chọn nút “=” để xem kết quả của phép toán thì chúng ta sẽ lập trình cho nút này như sau 
D – Các nút chức năng còn lại (Sqrt – tính căn bậc hai, 1/x Ngịch đảo giá trị hiện có; % xác định phần trăm) các nút này tương đối đơn giản, tôi giới thiệu mã lệnh và bạn tự suy ngẫm lấy
Kết quả khi chương trình thi hành
Lời kết : Ở trên, tôi giới thiệu với bạn 1 chương trình ứng dụng đơn giản, về mặt giải thuật thì chẳng có gì phức tạp. Mục đích chính của bài viết này, tôi muốn giới thiệu với bạn cách sử dụng NetBean để lập trình dựa trên các đối tượng cơ bản của Swing Package và 1 số vấn đề sau:
- Các control cơ bản thường dùng cho GUI: jLabel, jPanel, jButton
- Sử dụng LayoutManager để hỗ trợ cho quản lý và trình bày các thành phần trên giao diện (Trong tình huống này chúng ta dùng GridLayout)
- Lập trình sự kiện trong java dựa trên các interface được cung cấp sẵn trong Package java.awt.event là:actionEvent và ActionListener
- Biết sử dụng Wrapper Class của java để chuyển đổi dữ liệu dựa trên các static method đã được cung cấp sẵn (VD: Long.parseLong(); Double.parseDouble(); String.valueOf())
Có 1 vấn đề nhỏ: Chương trình chưa thực sự hoàn thiện, bạn hãy thử dùng nó để tính toán trong nhiều tình huống khác nhau và xác định xem còn những tình huống nào, chương trình chưa xử lý được, sau đó bạn hãy tự hoàn thiện chương trình để cho sản phẩm của mình được chuẩn mục hơn.
Bài viết này có thể là hơi dài so với mức độ của 1 chương trình đơn giản nhưng bạn hãy kiên nhẫn, tôi muốn viết những bài viết để cho tất cả những ai mới bắt đầu với java cũng có thể làm được.
Chúc bạn học tốt Java.
20/01/2011