【问题标题】:Java paintComponents is not being called未调用 Java paintComponents
【发布时间】:2016-06-13 12:09:21
【问题描述】:

我正在尝试在JPanel 上绘制一些东西,但我似乎遇到了paintpaintComponent 方法的问题。可能与双缓冲有关,但我不确定。 public void paintComponent(Graphics g) 方法由于某种原因没有被调用,知道为什么吗?

这是我的代码:

   @Override
public void paintComponents(Graphics g) {
    super.paintComponents(g); //To change body of generated methods, choose Tools | Templates.
    System.out.println("paintComponents!");

    snakeHead.DrawSphere(g);

    if(foodShoulBeRedrawn){
        foodShoulBeRedrawn = false;
        spawnFood();
    }

    if(shouldSpawnBodyPart){
        shouldSpawnBodyPart = false;
        snake.get(snake.size() - 1).DrawSphere(g);

    }

    //spawnSnake();
    paintCalled = true;

    repaint();
}

/*
@Override
public void paint(Graphics g) {
    super.paint(g);

    snakeHead.DrawSphere(g);

    if(foodShoulBeRedrawn){
        foodShoulBeRedrawn = false;
        spawnFood();
    }

    if(shouldSpawnBodyPart){
        shouldSpawnBodyPart = false;
        snake.get(snake.size() - 1).DrawSphere(g);

    }

    //spawnSnake();
    paintCalled = true;

    repaint();
}
*/

【问题讨论】:

  • "paint-Components()" 不,它是 singular - paintComponent(Graphics) ..
  • 如需尽快获得更好的帮助,请发帖minimal reproducible exampleShort, Self Contained, Correct Example
  • 我就懒得理了,你知道这些函数是什么,反正我把整个代码贴出来了。
  • "发布了整个代码" 1) 不要转储你的整个代码。如果您不介意制作 MCVE,那么许多人也不会介意尝试提供帮助。 2) 在任何情况下,它都不是完整的代码。没有main(String[]) 方法来启动它,没有导入,没有像Sphere3D 这样的类的定义.. “我只是没有打扰” ..它显示了。
  • 调用repaint()会导致组件调用它的paint方法,包括paintComponent,所以从paint方法调用repaint会创建一个无限循环。不要从任何paint方法调用repaint。

标签: java swing paint paintcomponent


【解决方案1】:

您正在覆盖 Container#paintComponents(),它由您的 JFrame 继承。你需要扩展JPanel,而不是扩展JFrame,这样你就可以覆盖它的paintComponent()getPreferredSize()。然后您可以将面板add() 发送到JFrame,就像他们显示herehere 一样。

【讨论】:

  • 您是否打算让您的第二个链接指向docs.oracle.com/javase/8/docs/api/javax/swing/…
  • 酷,谢谢!我在 JForm 的帮助下完成了这个,所以据我了解,它会自动添加所有内容,即 NetBeans 本身。所以,是的,谢谢! :)
  • @VGR:不,但我所掌握的不是很清楚。谢谢你说些什么。我试图引导皇帝前往JPanel
【解决方案2】:

我认为 JFrame 不是 JComponent,因此永远不会调用 paintComponent 方法。 您应该将所有绘制方法放在 JPanel 中,并将其包含在您的 JFrame 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 2012-03-12
    相关资源
    最近更新 更多