2010-06-03 50 views
2

我創建了自定義的swing組件。我可以看到它(繪製方法繪製的網格),但添加的按鈕(由println驗證)未顯示。我究竟做錯了什麼?組件未在自定義JPanel/JComponent中顯示

背景信息:我正在嘗試構建一個可見對象樹,如Flash/AS3顯示列表。

public class MapPanel extends JComponent { // or extends JPanel, same effect 

    private static final long serialVersionUID = 4844990579260312742L; 

    public MapPanel(ShapeMap map) { 
     setBackground(Color.LIGHT_GRAY); 
     setPreferredSize(new Dimension(1000,1000)); 
     setLayout(null); 
     for (Layer l : map.getLayers()) { 
//   LayerView layerView = new LayerView(l); 
//   add(layerView); 
      System.out.println(l); 
      JButton test = new JButton(l.getName()); 
      add(test); 
      validate(); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 

     // necessary? 
     super.paintComponent(g); 

     // background 
     g.setColor(getBackground()); 
     g.fillRect(0, 0, getWidth(), getHeight()); 

     // grid 
     g.setColor(Color.GRAY);   
     for (double x = 0; x < getWidth(); x += 10) { 
      g.drawLine((int)x, 0, (int)x, getHeight()); 
     } 
     for (double y = 0; y < getHeight(); y += 10) { 
      g.drawLine(0, (int)y, getWidth(), (int)y); 
     } 

    } 

} 
+1

順便說一句,super.paintComponent()沒有必要,因爲你的代碼完全用fillRect()方法填充背景。同樣在JComponent的情況下,paintComponent()方法沒有默認的繪製代碼。但是,通常建議調用paintComponent()方法,除非您有特殊原因不這樣做。 – camickr 2010-06-03 17:07:39

回答

2

設置null作爲佈局管理器,然後添加按鈕不會有任何影響。佈局管理器負責計算子組件的邊界,並將佈局管理器設置爲null,從而有效地保留所有按鈕的邊界=(0,0,0,0)。

嘗試調用test.setBounds(10,10,50,20)作爲快速測試以查看按鈕是否顯示。如果他們這樣做,他們將顯示在完全相同的位置。從那裏你可以安裝一個自定義佈局管理器,爲每個按鈕提供所需的邊界,或者使用核心/第三方佈局管理器之一。

+0

哦,我錯誤地認爲按鈕將被放置在0,0處,並且具有合理的默認尺寸。不要猜測:p setBounds使它們出現。下一步:用我自己的組件替換按鈕 – 2010-06-03 19:49:53

1

如果您給我們一個SSCCE,我們診斷您的問題會更容易。現在,我們可能沒有足夠的信息來解決您的問題。

我可以看到它(從油漆 方法繪製網格),

我不知道這意味着什麼,沒有在發佈代碼中沒有paint()方法。 (但我認爲這很容易假設你的意思是paintComponent(g)

但是,它看起來像問題是你是一個「空佈局」。除非您手動設置兒童的大小和位置,否則兒童不會繪畫。

您應該閱讀關於LayoutManagers的快速教程。繪製組件時,它可能會讓你更容易。

+1

「空白」佈局可能是問題,但對於其他問題,我認爲給定的代碼和解釋足以進行診斷,即使沒有運行它。如果你稍微放鬆一下聽起來有點居高臨下的最後部分,我會+1。另外,我想,抱怨質量問題應該留在評論中。 – Gnoupi 2010-06-03 15:32:13

+0

@Gnoupi同意! (所有的) – jjnguy 2010-06-03 15:36:08

+0

當我發佈那裏,其他2個迴應已被刪除,因爲他們在哪裏脫主題。這告訴我這個問題可能沒有你想象的那麼完整。根據定義,在提問時,OP不知道問題出在哪裏,因此不知道是否包含了所有必要的信息。這就是爲什麼每個問題都應該發佈SSCCE的原因。是的,有時我們可以正確猜測,但是,總的來說,人們需要花更多時間來確保問題清晰簡明,所以我們不花時間猜測和假設。 – camickr 2010-06-03 16:57:16