2011-01-13 41 views
7

JLayeredPane cho phép một ngăn xếp nhiều thành phần lên trên nhau bằng cách sử dụng JLayeredPane.add(Component, Integer). Các thành phần trong màn hình "lớp" cao hơn trên đầu trang của các thành phần trong "lớp" thấp hơn.Lớp phủ JLayeredPane so với vùng chứa

Container.add(Component, int) cung cấp cơ chế tương tự theo đó Thành phần có các chỉ mục thấp hơn hiển thị trên đầu trang của Thành phần có chỉ mục cao hơn.

Xin lưu ý rằng cơ chế đầu tiên sử dụng Integer và cơ chế thứ hai sử dụng int. Ngoài ra, một hàm hiển thị các giá trị cao ở đầu các giá trị thấp và giá trị kia ngược lại. Đừng trộn cả hai :)

Câu hỏi của tôi là: điểm của việc sử dụng JLayeredPane khi Container đã cung cấp cùng một cơ chế là gì? Một thành phần có tốt hơn lớp kia không?

CẬP NHẬT: Ngoài ra còn có Container.setComponentZOrder(Component, int) để xem xét.

Trả lời

6

Trả lời câu hỏi của riêng tôi:

Container.add(Component, int)Container.setComponentZOrder(Component, int) hầu như giống hệt nhau. Cái cũ gọi removeNotify() trong khi cái thứ hai không (vì lý do hiệu suất).

Phân đoạn vùng chứa chỉ hoạt động nếu JComponent.isOptimizedDrawingEnabled() trả về giá trị sai. Một triển khai mà chỉ xảy ra để trả về false là ... bạn đã đoán được: JLayeredPane

Sử dụng phân tầng không được khuyến khích vì có thể có unexpected side-effects.

Cuối cùng, cần lưu ý rằng trong khi Vùng chứa khai báo add(Component, int) nó không thực sự vẽ các thành phần phân lớp chính xác. JComponent và các lớp con của nó thực hiện.

Một tìm kiếm thú vị khác: không bao giờ gọi repaint() trên con của JLayeredPane. Điều này sẽ khiến thành phần tự vẽ trên đầu bất kể thứ tự z của nó. Bạn chỉ nên gọi repaint() trên chính JLayeredPane.

+0

Re "không bao giờ gọi repaint() trên một đứa trẻ của JLayeredPane": Tôi tò mò về loại thành phần con bạn tìm thấy điều này với. Tôi chạy vào [một vấn đề tương tự] (http://stackoverflow.com/questions/5668721/jmenuitems-painting-over-higher-components-in-jlayeredpane) và xác định rằng, trong trường hợp của tôi ít nhất, đó là một vấn đề với JMenuItems đặc biệt. Chúng cư xử như thể chúng luôn ở trên đỉnh (trừ khi chúng trong suốt). –

+0

@Aaron, tôi không nhớ thành phần nào tôi đã sử dụng nhưng khi bạn nghĩ về nó, có nghĩa là tất cả các thành phần sẽ hành xử chúng luôn ở trên đầu. paint() có nghĩa là giả định rằng bạn sẽ thiết lập các giới hạn clip để ngăn chặn nó vẽ bên ngoài giới hạn mong muốn. Khi bạn gọi repaint() trực tiếp trên một thành phần con (không có giới hạn), bạn về cơ bản yêu cầu nó bỏ qua cha mẹ của nó. Nói cách khác, đây không phải là một lỗi trong việc thực hiện Swing. Đó là lỗi người dùng. – Gili

+0

Thực ra điều đó không chính xác. Xem [Vẽ trong AWT và Swing] (http://java.sun.com/products/jfc/tsc/articles/painting/), cụ thể là phần Xử lý Sơn.Nó nói rằng khi 'repaint()' được gọi trên JComponent, RepaintManager sử dụng hình chữ nhật clip và các thuộc tính 'opaque' và' isOptimizedDrawingEnabled' của thành phần để xác định thành phần 'root' mà từ đó hoạt động sơn phải bắt đầu. Hầu hết các thành phần, trên thực tế, không hoạt động như thể chúng luôn ở trên cùng (tức là 'alwaysOnTop()' trả về 'false' theo mặc định). –

0

Việc tôi thực hiện việc này là các chức năng Container.add(Component,int)JLayeredPane.add(Component,Integer) đặt thành phần được thêm vào một chỉ mục nhất định. Sau đó, chỉ mục này được các trình quản lý bố trí sử dụng để xử lý vị trí, bố cục và thứ tự của bức tranh của thành phần. Tôi nghĩ rằng JLayeredPane.setLayer(Component c, int layer) là nhiều hơn những gì bạn đang tìm kiếm như xa như các lớp đi. Nó được tạo ra đặc biệt để lớp các thành phần. Chỉ là hai ý nghĩa của tôi.