使用Graphics的JPanel自定义绘图

我有一个自定义JPanel,有时在我的程序中,我需要调用一个方法,将屏幕画成黑色,就是这样。

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

当我启动程序时,我称之为此方法。

但是,我发现它有时会起作用,有时则不然。 这很奇怪。 我还发现,当它不起作用时,图形对象不为null,宽度和高度也正确定义(来自getWidth()和getHeight())。

为什么这有时会起作用,有时候不起作用?

在程序的某个时刻在我的JPanel上制作自定义绘图的正确方法是什么? 我正在使用getGraphics()是否正确? 我的JPanel(在某些时候)有JComponents,但后来我删除了那些JComponents并做了一些自定义图形绘制。 为什么这有时只会起作用?

不要通过在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 } }