好吧,我想知道为什么下面的代码不能显示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);
}
}发布于 2011-02-12 05:37:11
我建议您不要在paint方法中添加组件到容器中,因为1)您不能绝对控制何时调用paint方法,以及2) paint和paintComponent必须尽可能快,并且这不是更新图形用户界面的时间或地点。3)由于paint经常被调用多次,因此您将多次将组件添加到您的容器中,并且所有组件都不受直接控制。
此外,当您在paint方法中将组件添加到根(不管根是什么,因为它没有扩展JComponent、JPanel或类似的对象)时,根对象永远不会添加到我能告诉您的任何其他内容中,所以没有任何“添加”到最终没有添加到顶级窗口的组件将是可见的。
结论:我认为你需要重新设计图形用户界面作为你的解决方案。如果你告诉我们更多关于它的信息,我们可以帮助你。接下来,我们需要讨论布局管理器的使用,以及为什么设置组件的绝对位置和大小通常是不受欢迎的。
如果我说的任何事情令人困惑,请要求澄清,或者如果有任何错误,请帮助我纠正它!
发布于 2011-02-12 07:21:47
不应在paint方法内创建JLabel,而应在初始化MyPanel时创建一次。您的label是节点的渲染器组件,原则上这是一件好事。你可以看看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()方法被实际调用。
https://stackoverflow.com/questions/4974268
复制相似问题