2011-02-11 88 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()来调用的。