2011-01-13 22 views
7

JLayeredPane, JLayeredPane.add(Component, Integer) kullanarak birbirinin üzerine birden çok Bileşen yığılmasına izin verir. Daha yüksek "katmanlar" içindeki bileşenler, alt "katmanlardaki" Bileşenlerin üstünde görüntülenir.JLayeredPane ve Konteynır katmanına karşı

Container.add(Component, int), alt dizinlerine sahip Bileşenlerin daha yüksek dizinlere sahip Bileşenlerin üstünde görüntülendiği benzer bir mekanizma sağlar.

ilk mekanizma Tamsayı kullanır ve ikinci mekanizma int kullandığını lütfen unutmayın. Ayrıca, biri düşük olanların üstünde yüksek değerler oluşturur, diğeri ise tersini yapar. İki karıştırmayın :)

Sorum şu: Kapsayıcı aynı mekanizmayı zaten sağladığında JLayeredPane kullanmanın amacı nedir? Bir katman bileşeni diğerinden daha iyi mi?

UPDATE: Ayrıca düşünmek için Container.setComponentZOrder(Component, int) vardır.

cevap

6

:

Container.add(Component, int) ve Container.setComponentZOrder(Component, int) neredeyse aynıdır. Birincisi removeNotify() öğesini çağırır, ikincisi ise (performans nedeniyle).

Kapsayıcı yalnızca, JComponent.isOptimizedDrawingEnabled() yanlış döndürürse çalışır. Yanlışlıkla dönmek için yapılan bir uygulama ... siz tahmin ettiniz: JLayeredPane

Kapsayıcı kullanımı, unexpected side-effects olabileceğinden önerilmez. Son olarak, Kapsayıcı add(Component, int) bildirirken, aslında katmanlı bileşenleri düzgün şekilde boyamayacağını belirtmek gerekir. JComponent ve alt sınıfları yapar.

Başka bir ilginç bul: asla JLayeredPane'in bir çocuğunda repaint() öğesini çağırmayın. Bu, bileşenin z sırasına bakılmaksızın kendini boyamasına neden olur. Yalnızca JLayeredPane'in kendisinde repaint() öğesini çağırmalısınız.

+0

Yeniden "hiçbir zaman JLayeredPane'in bir çocuğuna repaint() çağırma": Bunu hangi alt bileşenle bulduğunuzu merak ediyorum. [Benzer bir sorun] (http://stackoverflow.com/questions/5668721/jmenuitems-painting-over-higher-components-in-jlayeredpane) ile karşılaştım ve en azından benim durumumda bir sorun olduğunu belirledim. JMenuItems özellikle. Her zaman zirvede gibi davranırlar (şeffaf olmadıkları sürece). –

+0

@Aaron, Kullandığım bileşeni hatırlamıyorum ama bu konuda düşündüğünüzde, tüm bileşenlerin her zaman en üstte olacağı şekilde davranmaları mantıklı. paint(), istenen sınırların dışında çizim yapmasını önlemek için klip sınırlarını ayarlayacağınızı varsaymak içindir. Resaint() dosyasını doğrudan bir alt bileşeni üzerinde (hiçbir sınırlama olmadan) çağırdığınızda, esas olarak üst öğeyi görmezden gelmeniz istenir. Başka bir deyişle, Swing uygulamasında bu bir hata değildir. Bu kullanıcı hatası. – Gili

+0

Aslında bu doğru değil. Özellikle [AWT ve Swing'te Boyama] (http://java.sun.com/products/jfc/tsc/articles/painting/), özellikle de Boya İşleme bölümü.Bir JComponent üzerinde 'repaint()' çağrıldığında, RepaintManager'ın, boya işleminin başlaması gereken 'root' bileşenini belirlemek için clip dikdörtgenini ve bileşenin 'opaque 've' isOptimizedDrawingEnabled' özelliklerini kullandığını belirtir. Çoğu bileşen, aslında, her zaman üstte oldukları gibi davranmazlar (yani "alwaysOnTop()" varsayılan olarak false döndürür). –

0

Bunu yapmam, Container.add(Component,int) ve JLayeredPane.add(Component,Integer) işlevlerinin, belirli bir dizine eklenen bileşene ayarlanmasıdır. Daha sonra, düzen yöneticilerinin, bileşenin konumunu, düzenini ve sırasını işlemek için kullandıkları bu dizin. Bence JLayeredPane.setLayer(Component c, int layer), katmanlar kadar aradığınız şey. Bileşenleri katmanlamak için özel olarak yaratılmıştır. Sadece iki anlamda. Kendi soru cevaplama

İlgili konular