Chuyển đổi như thế nào?

Một phần của tài liệu Giáo trình java gửi với Swing (Trang 58 - 63)

Trong phần này sẽ phác thảo về trình tự các bước của việc chuyển đổi chương trình của bạn sang dùng các thành phần Swing. Việc chuyển đổi này được áp dụng giống nhau cho cả ứng dụng và applets, trừ phi có những lưu ý khác. Hoàn toàn tốt đẹp khi thực hiện việc chuyển đổi một chương trình AWT sử dụng JDK 1.1.

Sau đây là trình tự các bước:

Bước 1: Lưu dự phòng một bản copy của chương trình sẽ chuẩn bị chuyển đổi.

Copy tất cả các tập tin của chương trình, kể cả tập tin .java và .class. Những bản copy này sẽ hữu dụng cho chung sta trong một số trường hợp sau:

- Cần tham chiếu đến phần mã nguồn trong quá trình chuyển đổi diễn ra.

- Sau khi chuyển đổi, có thể chạy cả hai bản để có thể so sánh giữa chúng với nhau.

- Một vài chương trình người dùng có thể chưa sẵn sàng nâng cấp VM lên phiên bản có hỗ trợ lớp Swing. Do đó, có thể là tạm thời sử dụng chương trình với AWT.

Bước 2: Xoá bỏ tất cả những tham chiếu đến gói java.awt.

Trong bước này, trình biên dịch sẽ làm việc cho bạn. Để thực hiện việc này, cần vô hiệu tất cả các dòng import hoặc các đoạn lệnh liên quan đến gói java.awt, trình bêin dịch sẽ nhắc nhở mỗi khi ta dùng một vài lớp nàp đó của gói AWT.

Tuy nhiên, vẫn có một vài lớp thuộc gói AWT vẫn dùng được, ví dụ như layout managers, nhưng tốt nhất thì chương trình của bạn không nên dùng các thành phần của AWT. Sau đây là một đoạn lệnh cần được xoá bỏ:

//import java.awt.*; //temporarily remove this import or

//import java.awt.Button; //temporarily remove this import import java.awt.Color; //it's OK to leave this in, since //Color isn't a component

...

/*java.awt.*/Frame = new /*java.awt.*/Frame(...);

Trường hợp không có tham chiếu đến gói AWT, tình biên dịch sẽ phát một lỗi

"not found" khi phát hiện trong chương trình có sử dụng các thành phần AWT.

Điều này giúp cho việc chuyển đổi dẽ dàng hơn là phải ngồi dò từng dòng lệnh trong cái rừng mà bạn vừa mới tạo ra. Lúc đó, chỉ việc thay đổi các thành phần AWT sang các thành phần Swing một cách dễ dàng. Trong bước thứ 9, ta sẽ tìm hiểu cách thêm vào lại các lớp thuộc gói AWT nếu cần.

Step 3: Nếu chương trình là một applet, gở bỏ dòng lệnh import java.applet.*

(nếu có) và bất kỳ tham chiếu nào liên quan đến java.applet.Applet.

Ta không cần tham chiếu đến lớp Applet vì Swing applet đã trở thành một lớp con của lớp JApplet của Swing. Nếu chương trình đang sử dụng AppletContext, AppletStub, hoặc AudioClip thì cần phải giữ lại những lớp này trong gói java.applet. Sau đây là một ví dụ:

//import java.applet.*; //temporarily remove this import import java.applet.AppletContext; //add this if necessary Bước 4: Import the gói Swing.

Thêm dong fllẹnh sau đay vào chương trình.

import javax.swing.*;

Dòng lệnh sẽ imports các thành phần Swing cùng với một số lớp Swing khác.

Bước 5: Kiểm nhận một tiến trình an toàn!

Trước khi tiếp tục, cần lưu ý rằng: Although AWT is thread-safe, Swing is not.

Hầu hết các chương trình đều định nghĩa các thành phần trong các phương thức event-handling và painting, là nhưng phương thức được gọi từ tiến trình event- dispatching. Định nghĩa một thành phần trong nhưng phương thức là an toàn.

Tuy nhiên, nếu chương trình cần định nghĩa một thành phần ở bất cứ nơi nào khác nữa, ví dụ như trong một tiến trình chính sau khi GUI đã hiển thị, hoặc trong mã lệnh, thì nhất thiết phải làm cho nó là thread-safe.

Bước 6: Thay đổi mỗi thành phần AWT thành những thành phần Swing tương ứng.

Trong nhiều trường hợp, các thành phần AWT và các thành phần Swing tương ứng đều tương thích về mã lệnh, chỉ cần thay đổi rất đơn giản về tên gọi của các thành phần mà thôi. Ví dụ như để thay đổi môt AWT button sang một Swing button, chỉ cần thực hiện như trong bảng dưới đây:

AWT Code:

Button button = new Button("A Button");

button.addActionListener(this);

Swing Code:

JButton button = new JButton("A Button");

button.addActionListener(this);

Một vài thành phần Swing có mã nguồn không tương thích với thành phần AWT tương ứng. Do đó, có một vài thành phần AWT phải viết lại mã lệnh khi chuyển sang sử dụng các thành phần Swing.

Bước 7: Chuyển đổi cách gọi phương thức add và setLayout.

Chương trình sử dụng các thành phần AWT, ta có thể thêm trực tiếp các thành phần AWT vào trong frames, dialogs, và applets. Tương tự, ta cũng có thể xác lập các layout manager trực tiếp vào các đối tượng chứa trên. Trong trường hợp ngược lại, khi sử dụng các phiên bản Swing có chứa các đối tượng trên, khi thêm các thành phần thì gọi content pane. Các ví dụ đơn giản sau:

AWT Code:

frame.add(panel, BorderLayout.CENTER);

Swing Code:

frame.getContentPane().add(panel, BorderLayout.CENTER);

Và đây là phần chi tiết:

AWT Code:

frame.setLayout(new FlowLayout());

frame.add(button);

frame.add(label);

frame.add(textField);

Swing Code:

Container contentPane =

frame.getContentPane();

contentPane.setLayout(new FlowLayout());

contentPane.add(button);

contentPane.add(label);

contentPane.add(textField);

Đoạn mã sau minh hoạ cách chuyển đổi mã của một applet. Chú ý rằng layout manager mặc định của một content pane là BorderLayout chứ không phải FlowLayout được sử dụng trong Applet.

AWT Code:

setLayout(new BorderLayout());

add(button, BorderLayout.NORTH);

add(panel, BorderLayout.CENTER);

Swing Code:

Container contentPane = getContentPane();

contentPane.add(button, BorderLayout.NORTH);

contentPane.add(panel, BorderLayout.CENTER);

Bước 8: Di chuyển mã lệnh của việc vẽ ra khỏi các phương thức paint và update.

Với các thành phần Swing, việc thực hiện painting trong mã lênh được thể hiện trong phương thức paintComponent. Cách khác để thực hiện painting là sử dụng các icon chuẩn hoặc tự tạo và đường viền.

Nếu trong chương trình có các lớp con Frame, Dialog, hoặc Applet thực thi việc làm tươi hay vẽ thì cần phải di chuyển các mã lệnh vào trong một thành phần khác. Còn việc xác định chính xác thành phần nào thì lại phụ thuộc kiểu của painting. Nếu một đối tượng chứa có thể thực hiện một icon thì có thể thay thế

thành phần đó bằng một label. Ngoài ra, các thành phần khác có thể thay thế bởi các lớp con của lớp Jpanel. Có thể thêm các thành phần vào các content pane của frame, dialog, hoặc applet như đã mô tả ở bước 7.

Bước 9: Sử dụng trình biên dịch để tìm kiếm các thay đổi cần thiết khác.

Sau khi đã phần mã nguồn như đã mô tả ở các bước trên, nên sử dụng trình biên dịch để vừa biên dịch vừa kiểm tra lại chương trình. Không nên sử dụng trình biên dịch trong lần đầu đối với chương trình của mình mà chưa có sự chỉnh sửa nào cả.

Trình biên dịch giúp chúng ta các công việc như sau:

Tìm kiếm các thành phần AWT mà chúng ta đã bỏ sót trong quá trình chuyển đổi sang Swing. Nếu như ta đã xoá tất cả các dòng lệnh tham chiếu đến java.awt như ở bước 2 thì trình biên dịch sẽ xuất hiện câu thông báo lỗi như sau:

TextEventDemo.java:23: Class Button not found Trong phần khai báo.

Button button = new Button("Clear");

^

Đến thời điểm này, viêc nhận dạng các lớp AWT trong chương trình vẫn còn cần thiết. Nếu như ta đã xoá tất cả các dòng lệnh tham chiếu đến java.awt, trình biên dịch hiển thị thông báo như sau:

TextEventDemo.java:17: Class BorderLayout not found Trong phần khai báo.

BorderLayout layout = new BorderLayout();

^

Các lớp AWT có thể vẫn còn được sử dụng bởi Swing trong chương trình.

Bước 10: Chạy chương trình Swing.

Thực hiện giống như đã mô tả trong phần biên dịch và chạy chương trình Swing.

Chương trình sẽ phát ra lỗi trường hợp chúng ta không nhớ thêm vào hay setLayout, các lỗi như sau:

java.lang.Error: Do not use javax.swing.JFrame.add() use

Một phần của tài liệu Giáo trình java gửi với Swing (Trang 58 - 63)

Tải bản đầy đủ (DOC)

(63 trang)
w