2010-02-16 15 views
6

JComponent sınıfını genişletdiğim özel bir Swing bileşenini oluşturmaya çalışıyorum.getGraphics() geçerli bir grafik örneğini ne zaman döndürür?

Bileşen gereksinimlerinin basitleştirilmesi amacıyla, bileşenimi her biri kendi yazı tipleriyle birkaç karakter dizisi oluşturmaya ihtiyaç duyuyor.

Bileşenimin, işlenen dizelerimin toplam genişliğine ve yüksekliğine tam olarak boyutlandırılmasına ihtiyacım var.

Bu boyutu belirlemek için, her dizenin boyutlarını hesaplamak için FontMetrics'i kullanıyorum. Bu bilgiye sahip olmak, bileşenimin hangi boyutta olacağını ve uygun şekilde yeniden boyutlandıracağını anlayabiliyorum.

Sorun şu ki, getGraphics() öğesine eriştiğimde her zaman boştur, bu yüzden FontMetrics örneğini alamıyorum. Bileşen boyutumun overboyalı paintComponent() yönteminden hesaplanmasını beklersem, çok geç (bileşen zaten bir boyuta sahip, değil mi?).

Bu belgede "Bu bileşen şu anda görüntülenemiyorsa, bu yöntem null değerini döndürecektir" der. Öyleyse, bileşenin ne zaman görüntülenmeye hazır olduğunu ve bileşenimi yeniden boyutlandırmak için bir Grafik nesnesinin ne zaman olduğunu bileceğim?

Çerçeve setVisible (true) çağrıldığında bileşeni oluşturmak için Swing çağırma sırası nedir?

Teşekkür


Güncelleme: Salı, Şubat 6, 2010 23:34

de yorumlarda feryat belirtildiği gibi, GridLayout hiç bir setXxxSize() saygı göstermiyor. İlgilenen herkes için, GridLayout, BoxLayout ve FlowLayout kullanarak, 200 genişlik 50 yüksekliğinde 5 sabit boyutlu bileşen (basit, azami ve tercihli olarak) alan basit bir çerçeve kullanarak sonuçlar yayınladım.

Test Sonuçları: (yorum belirtildiği gibi)

FlowLayout her zaman bileşenleri boyutu ne olursa olsun saygı

GridLayout zaman genişliği ve yüksekliği boyunca boyutlandırılır. PAGE_AXIS ve Y_AXIS yaklaşık yarım büyüklüklerine (104) unsurlarının genişliği küçüldü ama yüksekliğini çekinmez

BoxLayout gelince

....

LINE_AXIS ve X_AXIS sıfır gibiydi ama genişliğini dokunmadı ne bileşenlerin yüksekliği küçüldü.

cevap

7

İlk olarak, Dizelerinizi TextLayout sınıfını ve ilişkili öğelerini kullanarak ölçebilirsiniz.senin bileşeni ComponentListener kullanarak görünür hale gelmiştir Örneğin

İkincisi
public static void main(final String[] args) throws Exception 
{ 
    final FontRenderContext frc = new FontRenderContext(null, true, true); 
    final Font font = new Font("serif", Font.PLAIN, 18); 
    final TextLayout layout = new TextLayout("This is a test", font, frc); 
    final Rectangle2D bounds = layout.getBounds(); 
    System.err.println((int) (bounds.getWidth() + .5)); 
} 

için, haberdar edilebilir, ama bu "peşin" daki dizeleri ölçmek için gerekli değil!

+0

Yazı tipinizi oluştururken görüyor musunuz? GetFont() öğesini denediğimde, font boştur. Bir JComponent'in varsayılan bir fontu olmadığı varsayılıyor mu? – Jeach

+0

Yazı tipi açıkça ayarlanmamış bir Bileşen, üst öğesinin yazı tipini kullanır. Ebeveyniniz yoksa, yazı tipiniz yok. Kendi yazı tipinizi kurucunuza açıkça koymadan daha iyi olursunuz. –

+0

Teşekkürler Jonathan! Yazı tipini ayarlamak, yapmaya başladığım şey. Bileşeni bu şekilde şimdi doğru şekilde işleyebilirim, ancak bazı nedenlerden dolayı bu bileşen boyutlarıma boyut atmayı reddediyor. Izgara düzeni olan bir çerçeve oluşturursam (0 satır, 1 sütun) ve bileşenlerimden 10'u eklerseniz, çerçevenin tam ekranını oluşturun. Her öğe, çok daha küçük olmamasına rağmen, ekranın yüksekliğinin 1/10'unu alır. Min, max, tercih edilen setSize() öğesini ayarlıyorum ve yine de bir şekilde kendi beğenisine dönüşüyor! – Jeach

2

Dizelerinizi oluşturmak için bir JLabel kullanın, o zaman sadece thel etiketinin getPreferredSize() yöntemini kullanabilirsiniz.

+0

Sanırım birisinin bana bunu yapmak için mevcut Swing bileşenlerini kullanmasını söylemesini bekledim . Gereksinimlerim mevcut bloğun çoğunu bu bileşenden kaldırmak ve doğrudan kendim oluşturmaktır. Paneller içinde ve simgelerin içindeki daha fazla panel içinde, etiketler ve simgeler olmak için kullanılır. Sanırım otomatik bir araçla oluşturulmuştur. Şimdi bir diyete gitmeliyim söylendi! – Jeach

+0

İkinci düşünce, olay JLabel'lar sorunludur, çünkü yukarıdaki yorumumda Jonathan'a değinildiği gibi, etiket, yazı tipi boyutundan çok daha büyük olmayan sabit bir yükseklikte kalmalıdır. JLabel'ın benim bileşenimin yaptığı şeyi yapmaya eğilimi var ... germek! – Jeach

+0

Jonathan'ın belirttiği gibi bu bir düzen sorunu, "tercih edilen boyut" hesaplaması değil. Paneliniz için hala bir GridLayout kullanmak istiyorsanız, başka bir yaklaşım BorderLayout ile bir ana panel oluşturmaktır. Panelinizi GridLayout ile ana panelin NORTH’ına ekleyin. Artık tüm ekstra alan merkeze verilecek ve paneliniz tercih edilen boyutta görüntülenecektir. – camickr

İlgili konular