好的,我想知道为什么下面的代码不会显示JLabel。
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);
}
}
答案 0 :(得分:3)
我建议您不要在paint方法中将Component添加到Container中,因为1)当调用paint方法时,或者即使调用paint方法时,你也没有绝对控制; 2)paint和paintComponent必须快速闪耀尽可能,这不是更新GUI的时间或地点。 3)由于油漆经常被多次调用,因此您将多次向容器中添加组件,并且完全不受您的直接控制。
此外,当你在paint方法中将一个组件添加到Root(无论Root是什么,因为它不扩展JComponent,JPanel或类似的东西)时,Root对象永远不会被添加到我能告诉的任何其他内容中,所以有意义的是,没有“添加”到最终未添加到顶级窗口的组件中的任何内容都将是可见的。
结论:我认为你需要一个gui re-design作为你的解决方案。如果您告诉我们更多相关信息,我们可以为您提供帮助。接下来我们将讨论布局管理器的使用以及为什么设置组件的绝对位置和大小通常不受欢迎。
如果我说的话令人困惑,请询问澄清,如果有任何问题,请帮我纠正!
答案 1 :(得分: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也有一些更精彩的移动,旋转,缩放上下文的方法。)
除此之外,我没有看到任何问题。确保通过在其中放置一些System.out.println()来实际调用Node1.paint()
方法。