2011-08-01 20 views
8

paintComponent() işlevli bir JPanel sahibim. Bir kez arayacağım, sonra kullanıcı farklı bir JButton tıkladığında, bayrak ayarlayacağım ve bayrak ayarlandıktan sonra biraz farklı bir şey yapacağından bu fonksiyonu tekrar aramak istiyorum.JPanel Graphics takas ve yeniden boyama?

İşte merak ettiğim şey şu: paintComponent adresindeki mevcut öğeleri nasıl temizlerim? Ve yeniden çizebilmek için, tekrar paintComponent mu arayayım?

Şu anda çalışıyorum şu:

if (flag2==true) { 
    g.drawRect(...); 
} else { 
    g.drawLine(...); 
} 

Ama ben ne sorun var gibi görünüyor, testler aracılığıyla:

boya bileşeninde
flag2 = true; 
repaint(); //I expect (want) paintComponent to be called again 

, ben şeyler gibi yapmak yapıyor.

Yardımlarınız için teşekkür ederiz.

+0

paintComponent yönteminin içinden repaint() yöntemini çağırmıyorsunuz, değil mi? Reaint() çağrısının yenilenmesini istediğiniz panelle ilişkilendirildiğinden emin misiniz? (ör. myPanel.repaint())? –

cevap

14

sonra çağırmak gerekir:

panel.repaint(); 

bileşeni tekrar boyanacak neden.

Sonra paintComponent() yönteminde ilk deyimi olmalıdır: artık özel boyama yapmak, böylece

super.paintComponent(g); 

Bu arka plan boya olacaktır.

Daha fazla yardıma ihtiyacınız varsa, sorunu gösteren SSCCE numaralı postayı gönderin.

2

İlk olarak, neden bir boole yerine enum kullanmıyorsunuz? sorununuzla ilgili olarak

enum Enum { 
    RECTANGLE, 
    LINE, 
    CIRCLE 
} 

Enum choice = RECTANGLE; //default to RECTANGLE 

switch(choice) { 
    // case RECTANGLE, LINE, CIRCLE 
} 

, sorunuzun içinde yorumlarımı cevap verebilir?

+0

Sahip olduğum mantık iyi, muhtemelen enum kullanabiliyordum ama bu benim sorunum değil. Benim sorunum, çizilen tüm grafikleri temizlemem ve daha sonra bu JPanel için bir şekilde paintComponent'i yeniden çağırmam gerektiğidir. – JDS

+0

İstediğinizi elde etmek için tüm grafikleri temizlemeniz gerekmemelidir. –

+0

Camickr'ın cevabına bakın, eğer özetlediği şeyi yapmıyorsanız, önce buna odaklanın. –

2

Revalidate(); yeniden boyamak yerine(). boyutu/düzeni değiştirirken veya jpanel'inize nesne eklediğinizde/kaldırdığınızda ve tüm çocuklarını güncellerken revalidate() 'ın çağrılması gerekir. Anlatabildiğim kadarıyla hala aynı boya nesnesini kullanıyorsun ama düzenini değiştiriyorsun.