Java: Cách dùng bộ chứa mức top

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Swing cung cấp ba lớp container cấp cao hữu ích gồm JFrameJDialog, và JApplet. Khi sử dụng các lớp này bạn nên lưu ý:

  • Để xuất hiện trên màn hình thì mỗi thành phần giao diện phải là một phần của một bộ chứa phân cấp. Một bộ chứa phân cấp là một dạng cây gồm các thành phần trong đó có một bộ chứa nằm ở mức top hay mức gốc. Chúng ta sẽ thấy điều này ở phía dưới.
  • Mỗi thành phần giao diện chỉ có thể được chứa một lần. Nếu một thành phần đã có trong bộ chứa và bạn cố gắng thêm nó vào bộ chứa khác thì thành phần này sẽ được đưa ra khỏi bộ chứa đầu tiên để đặt vào bộ chứa thứ hai.
  • Mỗi bộ chứa mức top có một bảng nội dung để chứa (trực tiếp hoặc gián tiếp) các thành phần có thể nhìn thấy trong giao diện của bộ chứa mức top.
  • Bạn có thể tùy chọn thêm một thanh menu cho một bộ chứa mức top. Thanh menu theo quy ước được đặt trong bộ chứa mức top nhưng phải nằm bên ngoài bảng nội dung. Một số look-and-feel chẳng hạn như Mac OS cung cấp cho bạn các tùy chọn để đặt thanh menu ở một vị trí khác thích hợp hơn cho look-and-feel, chẳng hạn như ở trên cùng của màn hình.

Lưu ý:  Mặc dù JInternalFrame giống JFrame, nhưng frame bên trong thực sự không phải là bộ chứa mức top.

Dưới đây là hình ảnh về một frame được tạo bởi một ứng dụng. Frame chứa một thanh menu màu xanh lá cây (không có menu), và trong bảng nội dung của frame là một vùng trống lớn màu vàng.

Một ứng dụng đơn giản với một khung chứa một thanh menu và một khung nội dung.

Một sơ đồ các bộ phận chính của khung

Bạn có thể tìm thấy toàn bộ mã nguồn của ví dụ này trong TopLevelDemo.java. Mặc dù ví dụ này chỉ sử dụng JFrame, nhưng cơ bản bạn có thể áp dụng cho JApplets và JDialogs.

Đây là bộ chứa phân cấp cho giao diện của ví dụ này:

Ngăn chặn hệ thống phân cấp cho giao diện ví dụ của TopLeveDemo.

Sơ đồ này còn một vài điểm chưa thể hiện và ta sẽ thể hiện nó phía dưới của bài viết này. Dưới đây là những chủ đề thảo luận tiếp theo của bài viết:

Bộ chứa mức top và bộ chứa phân cấp

Mỗi chương trình sử dụng các thành phần Swing đều có ít nhất một bộ chứa mức top, đây là gốc của bộ chứa phân cấp - hệ thống phân cấp có chứa tất cả các thành phần Swing xuất hiện bên trong bộ chứa mức top.

Mỗi ứng dụng độc lập với một giao diện Swing có ít nhất một bộ chứa phân cấp với gốc là một JFrame. Ví dụ, nếu một ứng dụng có một cửa sổ chính và hai hộp thoại, thì ứng dụng có ba bộ chứa phân cấp, và do đó có ba bộ chứa mức top. Một bộ chứa phân cấp có gốc là JFramenhư, và hai bộ chứa phân cấp còn lại mỗi bộ có gốc là một JDialog.

Mỗi Applet Swing có ít nhất một bộ chứa phân cấp, một trong số đó có gốc là một JApplet. Ví dụ, một applet trả về một hộp thoại có hai bộ chứa phân cấp. Các thành phần trong cửa sổ trình duyệt đang ở trong một bộ chứa phân cấp có gốc là một đối tượng JApplet. Còn hộp thoại có bộ chứa phân cấp có gốc là một đối tượng JDialog.

Thêm các thành phần vào bảng nội dung

Dưới đây là đoạn mã mà ví dụ trước sử dụng để lấy bảng nội dung của frame và thêm nhãn màu vàng cho nó:

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

Như bạn thấy ở đoạn mã trên, ta tìm bảng nội dung của bộ chứa mức top bằng cách gọi phương thức getContentPane. Bảng nội dung mặc định là một bộ chứa trung gian đơn giản kế thừa từ JComponent, và sử dụng trình quản lý bố cục là một  BorderLayout.

Ta rất dễ dàng tùy chỉnh bảng nội dung, chẳng hạn bằng cách thiết lập trình quản lý bố cục hoặc thêm đường. Tuy nhiên, có một vấn đề nhỏ, đó là phương thức getContentPane trả về một đối tượng Container mà không phải là đối tượng JComponent. Điều này có nghĩa rằng nếu bạn muốn tận dụng lợi thế của bảng nội dung của tính năng JComponent thì bạn cần phải hoặc là định kiểu giá trị trả về hoặc tạo ra thành phần của riêng bạn để có bảng nội dung. Ví dụ chúng tôi thường tiếp cận theo cách thứ hai, vì nó rõ ràng hơn một chút. Một cách tiếp cận khác nữa là đôi khi chúng ta chỉ đơn giản là thêm một thành phần tùy chỉnh cho bảng nội dung, bao gồm cửa sổ nội dung hoàn chỉnh.

Lưu ý rằng trình quản lý bố cục cho JPanel là FlowLayout;.

Để tạo một thành phần cho bảng nội dung thì ta sử dụng phương thức setContentPane bộ chứa mức top. Ví dụ:

// To mt bng và thêm các thành phn vào nó.

JPanel contentPane = new JPanel(new BorderLayout());
contentPane.setBorder(someBorder);
contentPane.add(someComponent, BorderLayout.CENTER);
contentPane.add(anotherComponent, BorderLayout.PAGE_END);

topLevelContainer .setContentPane (ContentPane);

Lưu ý: 

Để thuận tiện, các phương thức add, remove và setLayout đã được ghi đè để chuyển cho contentPane khi cần thiết. Điều này có nghĩa bạn có thể viết

frame.add(child);

và child sẽ được bổ sung vào contentPane.

Lưu ý rằng chỉ có ba phương thức để thực hiện điều này, có nghĩa rằng getLayout() sẽ không trả lại tập bố cục với setLayout().


Thêm một thanh menu

Về lý thuyết, tất cả các bộ chứa mức top có thể chứa một thanh menu. Tuy nhiên trong thực tế, các thanh menu thường chỉ xuất hiện trong các frame và các applet. Để thêm một thanh menu cho bộ chứa mức top thì ta cần tạo ra một đối tượng JMenuBar, áp các mục cho nó và sau đó gọi phương thức setJMenuBarTopLevelDemo sẽ thêm một thanh menu vào frame của nó với câu lệnh sau:

frame.setJMenuBar (greenMenuBar);

Bảng gốc

Mỗi bộ chứa mức top đều dựa trên một bộ chứa trung gian gọi là bảng gốc. Bảng gốc quản lý các cửa sổ nội dung và thanh menu, cùng với một vài bộ chứa khác. Thường thì bạn không cần phải biết về các bảng gốc để sử dụng các thành phần Swing. Tuy nhiên, nếu bạn muốn chặn click chuột hoặc vẽ trên nhiều thành phần thì bạn nên làm quen với bảng gốc.

Dưới đây là danh sách các thành phần mà bảng gốc cung cấp cho một frame (và cho mỗi bộ chứa mức top khác):

Một cửa sổ gốc quản lý bốn tấm khác: một cửa sổ lớp, một thanh trình đơn, một cửa sổ, và một cửa sổ kính.

Ở phần trên ta đã trình bày với bạn về bảng nội dung và thanh menu tùy chọn. Ngoài ra, còn có hai thành phần khác mà một bảng gốc thêm vào là bảng layered và bảng glass. Bảng layered chứa thanh menu và bảng nội dung, và cho phép sắp xếp theo trục OZ các thành phần khác. Bảng glass thường được sử dụng để ngăn chặn các sự kiện đầu vào xảy ra thông qua bộ chứa mức top, và cũng có thể được sử dụng để vẽ trên nhiều thành phần.

» Tiếp: Lớp JComponent
« Trước: Thêm logic cho ứng dụng
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!