Thiết kế giao diện động với Swing
Chuyến đi đến các vùng ngoài của Swing API
Peter Seebach, Tác giả, 自由职业者
Tóm tắt: Bộ công cụ Giao diện người dùng (UI) của Swing làm cho nó có thể,
mặc dù không luôn ddàng, cập nhật động các giao diện người dùng để đáp lại
các sự kiện hoặc hành động của người dùng. Bài viết này xem xét một số cách phổ
biến mà bạn có thể xây dựng các UI được cập nhật động, xem xét vài cm bẫy có
thể gặp trên đường đi và một số nguyên tắc để giúp bạn quyết định khi nào đây là
cách tiếp cận thích hợp cho công việc.
Bộ công cụ Swing cung cấp nhiều công cụ để tạo các giao diện người dùng và một
mảng kì lạ về các tùy chọn để thay đổi các giao diện này trong vòng đời của
chương trình. Sử dụng cẩn thận các tính năng này có thể dẫn đến giao diện thích
ứng động theo nhu cầu của người dùng và đơn giản hóa tương tác. Sử dụng không
cẩn thận các tính năng tương tự có thể dẫn đến các chương trình rất khó hiểu hoặc
thậm chí các chương trình hoàn toàn không sử dụng được. Bài viết này giới thiệu
công nghvà triết lý về các UI động và giúp bạn vượt qua lúc khó khăn khi xây
dựng các UI hiệu quả. Bạn sẽ thay đổi mã nguồn dựa trên ứng dụng chương trình
giới thiệu (demo) của SwingSet2 được đảm bảo với JDK của Sun (xem
Resources); UI của ứng dụng này sử dụng một số đặc tính động và dùng như một
điểm khởi đầu tuyệt vời để hiểu chúng.
Đình chmột tiện ích (widget)
Hình thức đơn giản nhất của UI động là làm xám màu của các mục hay nút ấn của
trình đơn chưa sẵn sàng. Việc đình chcác widget UI thực hiện theo cùng cách với
tất cả các widget; hàm setEnabled() một tính năng của lớp Component (Thành
phần). Liệt kê 1 cho thấy mã để đình chmột nút:
Liệt kê 1. Đình chmột nút
button.setEnabled(false);
Ngay cả hành động đơn giản chuyển sang màu xám một tùy chọn trình đơn không
sử dụng hoặc nút hộp thoại liên quan đến sự thỏa hiệp với người sử dụng. Mặc dù
một nút ấn đã chuyển sang màu xám ngay lập tức thông báo cho người dùng rằng
một hành động cụ thể không thể thực hiện được, những nó không cho họ biết tại
sao. Điều này có thể là một vấn đề với người dùng, người có thể không hiểu lý do
(xem Các nguyên tắc chung).
Thật dễ dàng, khi bạn có thể nhìn thấy. Câu hỏi là khi nào bạn nên kích hoạt hay
đình chmột nút. Một quyết định thiết kế chung là đình chỉ một nút khi nó không
thích hp. Ví dụ, nhiều chương trình đình chỉ nút Save (và mục trình đơn tương
ứng bất kỳ) khi một tệp đã không được thay đổi kể từ lần lưu nó cuối cùng.
Lời cảnh báo chủ yếu cho việc đình chỉ các nút là nh kích hoạt lại chúng ở thời
điểm thích hợp. Ví dụ, nếu có một bước xác nhận giữa việc nhấn vào một nút và
hoàn thành hành động của nó, nút đó phải được kích hoạt ngay cả khi việc xác
nhận không thành công.
Điều chỉnh các phm vi
Đôi khi một ứng dụng cần điều chỉnh phạm vi của một số widget, như là một
Spinner (quay tròn) hoặc Slider (thanh trượt ), một cách động. Điều này có th
phức tạp hơn nó mong đợi. Các Slider, nói cthể, có các tính năng thứ cấp -- các
dấu thời gian, khoảng cách dấu thời gian và các nhãn -- mà chúng có thcần phải
được điều chỉnh cùng với phạm vi đó để tránh bị lỗi nặng.
Chương trình giới thiệu (demo) SwingSet2 không trực tiếp làm bất kỳ cái gì v
điều này, do đó bạn sẽ thay đổi nó bằng cách gắn một ChangeListener cho một
thanh trượt để có thể thay đổi thanh trượt khác. Nhập lớp SliderChangeListener
mới, chỉ ra trong Liệt kê 2:
Liệt kê 2. Thay đổi một phm vi của thanh trượt
class SliderChangeListener implements ChangeListener {
JSlider h;
SliderChangeListener(JSlider h) {
this.h = h;
}
public void stateChanged(ChangeEvent e) {
JSlider js = (JSlider) e.getSource();
int i = js.getValue();
h.setMaximum(i);
h.repaint();
}
}
Khi thanh trượt ngang thứ ba được tạo ra (một thanh trượt trong bản demo ban đầu
có dấu đánh dấu tất cả các đơn vị và ghi nhãn tại 5, 10 và 11), một
SliderChangeListener mới cũng được tạo ra, chuyển qua thanh trượt đó như là đối
số hàm tạo (constructor). Khi thanh trượt dọc thứ ba (có phạm vi 0 đến100) được
tạo ra, SliderChangeListener mới được thêm vào nó như là một người nghe
(listener) thay đổi. Điều này làm việc gần như mong đợi: Điều chỉnh thanh trượt
dọc thay đổi phạm vi của thanh trượt ngang.
Thật không may, các dấu và các nhãn cũng chẳng làm việc tốt. Các nhãn có tối đa
năm dấu làm việc tốt miễn là phạm vi này không quá lớn, nhưng nhãn phụ tại 11
nhanh chóng là vấn đề về tính sử dụng, như trong Hình 1:
Hình 1. Các nhãn chạy cùng nhau
Cập nhật các dấu và các nhãn
Giải pháp rõ ràng sđơn giản là đặt khoảng cách đánh dấu trên thanh trượt ngang,
bất cứ khi nào giá trị tối đa của nó được cập nhật, như thể hiện trong Liệt kê 3:
Liệt kê 3. Thiết lập khoảng cách đánh dấu