2010-12-10 41 views
1

當我嘗試使用myCustomPanel.add(someComponent)它不添加...無法項目添加到自定義彩繪的JPanel

這裏是我的自定義JPanel類:

import java.awt.Graphics; 
import java.awt.Image; 
import javax.swing.JPanel; 


/** 
* 
* @author Jacob 
*/ 
public class OSXMainPanel extends JPanel { 
    public static final long serialVersionUID = 24362462L; 


    private Image image; 


    public OSXMainPanel() { 
     super.setOpaque(true); 
     try { 
      image = javax.imageio.ImageIO.read(new java.net.URL(getClass().getResource("/assets/background.png"), "background.png")); 
     } catch (Exception e) {} 
    } 


    @Override 
    protected void paintComponent(Graphics g) { 
     if (isOpaque()) 
     { 
      g.setColor(getBackground()); 
      g.fillRect(0, 0, getWidth(), getHeight()); 
     } 
     for(int w = 0; w < this.getWidth(); w = w + 50) { 
      for(int h = 0; h < this.getHeight(); h = h + 50) { 
       g.drawImage(image, w, h, 50, 50, this); 
      } 
     } 
    } 


} 
+1

發佈您的SSCCE(http://sscce.org),證明問題。您發佈的代碼中沒有任何內容會阻止子組件被繪製。如果你看到圖像,那麼你應該看到組件。所以問題在別處。 – camickr 2010-12-10 16:47:52

回答

3

這是不工作的原因是因爲您的paintComponent方法不繪製添加的組件。在paintComponent方法的開始調用super.paintComponent(g)應該可以解決這個問題。

+1

+1在此過程中,背景顏色的fillRect()變得不必要。 – perp 2010-12-10 11:32:10

+1

paintComponent不繪製子組件。你一定在考慮paintComponents。 – 2010-12-10 15:49:46

+2

-1,我同意拉斯。看看Swing教程中關於繪畫的部分,它將更詳細地解釋這一部分:http://download.oracle.com/javase/tutorial/uiswing/painting/closer.html – camickr 2010-12-10 16:54:00

-2

我會叫updateUI()

myPanel.add(new JLabel("wanna see it")); 
// change of look and feel 
myPanel.updateUI(); 

添加組件後 - 如果要更新整個外觀和感覺。否則使用revalidate()。

myPanel.add(new JLabel("wanna see this")); 
myPanel.revalidate(); 
+0

它有什麼不對? – d1x 2010-12-10 12:27:48

+0

我沒有downvote,但問題是,它根本沒有被繪。通常描繪添加到面板的代碼正在被覆蓋,而不是繪製添加的組件。調用updateUI或重新驗證不會解決這個問題。 – Jim 2010-12-10 13:45:17

0

不應該有必要調用super.paintComponent(Graphics g)來繪製子組件。該電話很有用,可以繪製背景,但不是絕對必要的。

我測試了Java 6上的代碼,它對我來說工作得很好。我唯一的修改是增加下面一行在構造函數中:

add(new JLabel("Test")); 

我沒有背景圖片文件,使圖像的繪製代碼是什麼都不做。背景圖像以某種方式遮住了子組件,或者在添加子組件的代碼中存在錯誤。嘗試註釋drawImage調用並查看子組件是否可見。

相關問題