JPanel自定义绘图使用Graphics

5

我有一个自定义的JPanel,有时在程序中需要调用一个方法来将屏幕涂黑,仅此而已。

public void clearScreen() {
    Graphics g = getGraphics();
    g.setColor(Color.black);
    g.fillRect(0,0,getWidth(),getHeight());
}

当我启动程序时,我调用这个方法。然而,有时它有效,有时无效,这非常奇怪。我还发现,当它无效时,图形对象不是null,并且宽度和高度也已正确定义(通过getWidth()和getHeight())。为什么有时会有效,有时会无效呢?在程序中某个点上,制作自定义绘图的正确方式是什么?像我现在这样使用getGraphics()是正确的吗?我的JPanel(在某些情况下)具有JComponents,但稍后我会删除这些JComponents并进行一些自定义图形绘制。为什么这有时只有部分有效?
1个回答

14

不要通过调用像JPanel这样的组件上的getGraphics来获取Graphics对象,因为获取到的Graphics对象在下一次重绘时不会保留(这很可能是你问题的源头)。

相反,考虑将所有的绘图都放在一个BufferedImage中,然后您可以尽情地使用getGraphics()。如果这样做,请不要忘记在绘制完成后释放Graphics对象。

例如:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class MyPaint extends JPanel {
   public static final int IMG_WIDTH = 400;
   public static final int IMG_HEIGHT = IMG_WIDTH;

   private BufferedImage image = new BufferedImage(IMG_WIDTH, IMG_HEIGHT,
            BufferedImage.TYPE_INT_ARGB);

   public MyPaint() {
      MyMouseAdapter myMouseAdapter = new MyMouseAdapter();
      addMouseListener(myMouseAdapter);
      addMouseMotionListener(myMouseAdapter);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (image != null) {
         g.drawImage(image, 0, 0, null);
      }
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(IMG_WIDTH, IMG_HEIGHT);
   }

   public void clearScreen() {
      Graphics g = image.getGraphics();
      g.setColor(Color.black);
      g.fillRect(0, 0, image.getWidth(), image.getHeight());
      g.dispose();
      repaint();
   }

   private class MyMouseAdapter extends MouseAdapter {
      // code to draw on the buffered image. 
      // Don't forget to call repaint() on the "this" JPanel
   }
}

那么,创建一个BufferedImage,然后将其绘制在JPanel上? - CodeGuy
@reising1:请查看我编辑的代码示例,它可以演示我的意思。 - Hovercraft Full Of Eels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接