Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java绘制问题_Java_Swing_Paint_Jlabel - Fatal编程技术网

Java绘制问题

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

好的,我想知道为什么下面的代码不会显示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);
  }
}

我建议您不要将组件添加到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()来实际调用