Java绘制问题
好的,我想知道为什么下面的代码不会显示JLabel MyPanel被正确添加到JFrame和所有内容中,因为它全部显示,但不会绘制JLabel。感谢您的帮助Java绘制问题,java,swing,paint,jlabel,Java,Swing,Paint,Jlabel,好的,我想知道为什么下面的代码不会显示JLabel MyPanel被正确添加到JFrame和所有内容中,因为它全部显示,但不会绘制JLabel。感谢您的帮助 public class MyPanel extends JPanel { private Root root; ... public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D
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);
}
}
我建议您不要将组件添加到paint方法中的容器中,因为1)您无法绝对控制何时调用或是否调用paint方法,2)paint和paintComponent必须尽可能快,而且这不是更新GUI的时间或地点。3) 由于paint经常被多次调用,因此您将多次向容器中添加组件,这一切都是您无法直接控制的 此外,当您在paint方法中将组件添加到根中时(无论根是什么,因为它没有扩展JComponent、JPanel或类似的),根对象永远不会添加到我能说的任何其他内容中,因此,没有任何“添加”到组件的内容(最终没有添加到顶级窗口中)将是可见的 一句话:我认为您需要一个gui重新设计作为您的解决方案。如果你多告诉我们一些,我们可以帮你。接下来,我们需要讨论布局管理器的使用,以及为什么设置组件的绝对位置和大小通常是不受欢迎的
如果我说的任何话令人困惑,请要求澄清,或者如果有任何错误,请帮助我纠正 我建议您不要将组件添加到paint方法中的容器中,因为1)您无法绝对控制何时调用或是否调用paint方法,2)paint和paintComponent必须尽可能快地运行,而这不是更新GUI的时间或地点。3) 由于paint经常被多次调用,因此您将多次向容器中添加组件,这一切都是您无法直接控制的 此外,当您在paint方法中将组件添加到根中时(无论根是什么,因为它没有扩展JComponent、JPanel或类似的),根对象永远不会添加到我能说的任何其他内容中,因此,没有任何“添加”到组件的内容(最终没有添加到顶级窗口中)将是可见的 一句话:我认为您需要一个gui重新设计作为您的解决方案。如果你多告诉我们一些,我们可以帮你。接下来,我们需要讨论布局管理器的使用,以及为什么设置组件的绝对位置和大小通常是不受欢迎的
如果我说的任何话令人困惑,请要求澄清,或者如果有任何错误,请帮助我纠正 您不应该在paint方法中创建
JLabel
,而是在初始化MyPanel时创建一次。标签是节点的渲染器组件,原则上这是一件好事。您可以查看JTable、JList和JTree的渲染器是如何工作的
在您的情况下,不要设置标签的位置(它不会更改任何内容,因为它的绘制方法希望其图形对象由其自身的左上角定向),而是转换图形上下文:
Graphics copy = g.create((int)x, (int)y, (int)width, (int)height);
jtp.paint(copy);
(Graphics2D还有一些更奇特的方法来移动、旋转和缩放上下文。)
除此之外,我看不出有任何问题。通过在其中放置一些System.out.println(),确保实际调用了
Node1.paint()
方法。您不应该在paint方法内部创建JLabel
,而应该在初始化MyPanel时创建一次。标签是节点的渲染器组件,原则上这是一件好事。您可以查看JTable、JList和JTree的渲染器是如何工作的
在您的情况下,不要设置标签的位置(它不会更改任何内容,因为它的绘制方法希望其图形对象由其自身的左上角定向),而是转换图形上下文:
Graphics copy = g.create((int)x, (int)y, (int)width, (int)height);
jtp.paint(copy);
(Graphics2D还有一些更奇特的方法来移动、旋转和缩放上下文。)
除此之外,我看不出有任何问题。确保您的Node1.paint()
方法通过在其中放置一些System.out.println()来实际调用