Java重绘单个图像

时间:2014-01-26 23:51:17

标签: java swing bufferedimage graphics2d repaint

我使用paint()方法将许多bufferedImage绘制到JFrame上,

public void paint(Graphics g){
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(bufferedImg, x, y, layeredPane);
        ...More images
    }

问题是它重新绘制了所有图像,因此屏幕将变为空白,然后显示图像。我需要重绘单个图像,而不是绘制方法中的所有内容。 所以我尝试将另一个方法与paint方法分开,然后调用它......

public void drawImage(){
    Graphics2D g2d = (Graphics2D) getGraphics();

    if (condition == true) g2d.drawImage(bufferedImg, x, y, layeredPane);
}

这适用于绘制图像,但是一旦布尔值设置为false并调用,它仍然会将图像保留在屏幕上。 对不起,如果以前发布过,我看过很多关于用Java重新绘制图像的帖子,但我找不到专门重绘单个图像的帖子。

1 个答案:

答案 0 :(得分:2)

  1. 如果您的程序是Swing程序,那么您不应该覆盖绘制,而是覆盖JComponent派生类的paintComponent(...)
  2. 您可以通过调用repaint(Rectangle r)来限制重绘区域的位置,矩形的边界是您想要更改的区域的边界。
  3. 您不应该通过调用组件上的getGraphics()来获取Graphics上下文,因为这将只为您提供一个短暂的Graphics对象,并且使用它绘制的任何内容都将在重绘中丢失。
  4. 如果您的许多图片没有变化,如果它们充当背景,请考虑将它们绘制到一个背景BufferedImage,然后在paintComponent(...)方法中绘制一个。
  5. 如需更多帮助,请考虑创建并发布minimal, compilable, runnable example program


    修改
    关于你的新帖子:

      

    我使用paint()方法将许多bufferedImage绘制到JFrame上

    不,永远不要直接绘制到JFrame,因为你失去了Swing图形的许多好处,包括双缓冲,并且有可能弄乱边框和子组件的绘制。您需要阅读Swing custom painting tutorial以了解有关如何正确绘制的更多信息。