2011-02-11 91 views
0

好吧,我想知道爲什麼下面的代碼不會顯示JLabel。Java Paint問題

MyPanel正在被正確地添加到JFrame和所有東西,因爲它全部顯示但不會繪製JLabel。任何幫助表示讚賞。

public class MyPanel extends JPanel { 
    private Root root; 
    ... 

    public void paintComponent(Graphics g) 
    { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    root.paint(g2); 
    } 
} 

class Root { 
    private Node1 node1; 

    ... 
    public void paint(Graphics g) { 
    node1.paint(g); 
    } 
} 

class Node1 { 
    ... 
    public void paint(Graphics g) { 
    JLabel jtp = new JLabel(); 
    jtp.setLocation((int) x, (int) y); 
    jtp.setSize((int) width, (int) height); 
    jtp.setLocation(40, 40); 
    jtp.setSize(40, 40); 
    jtp.setText("Hello world"); 
    //jtp.setVisible(true); 
    jtp.paint(g); 
    } 
} 

回答

3

我建議你不要在油漆方法1組件添加到一個容器)你沒有絕對的控制權的時候或者即使paint方法將被調用,2)油漆的paintComponent有儘可能快地發展,並且這不是更新GUI的時間或地點。 3)由於油漆通常會被多次調用,因此您將會多次將組件添加到您的容器中,並且全部不受您的直接控制。

另外,當您在paint方法中向Root添加組件(無論Root是否擴展JComponent,JPanel或類似)時,Root對象永遠不會添加到我可以告訴的任何其他,所以它是有道理的,沒有什麼「添加」到最終沒有添加到頂層窗口的組件中。

底線:我認爲你需要一個gui重新設計作爲你的解決方案。如果你告訴我們更多關於它的信息,我們可以幫助你。接下來,我們需要討論佈局管理器的使用,以及爲什麼設置組件的絕對位置和大小通常是不被接受的。

如果我說的是混淆,請澄清,或者如果有任何錯誤,請幫我改正它!

2

你不應該在paint方法內創建你的JLabel--而應該在初始化MyPanel時創建一次。你的標籤是一個渲染器組件爲你的節點,原則上是一件好事。你可以看看JTable,JList,JTree的渲染器是如何工作的。

對於你的情況,不要設置你的標籤的位置(它不會改變任何東西,因爲它是paint-method期望它的圖形對象被它自己的左上角取向),而是轉換Graphics-context :

Graphics copy = g.create((int)x, (int)y, (int)width, (int)height); 
jtp.paint(copy); 

(Graphics2D的具有平移,旋轉,縮放的背景下,也有些更看中的方法)

比這

其他,我看不出有什麼問題。確保您的Node1.paint()方法實際上是通過在其中放入一些System.out.println()來調用的。