java - JPanel自定义绘图使用Graphics

标签 java swing graphics jframe jpanel

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

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

当我启动程序时,我调用这个方法。

但是,我发现它有时有效,有时无效。这很奇怪。我还发现,当它不起作用时,图形对象不为空,并且宽度和高度也被正确定义(来自 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
   }
}

关于java - JPanel自定义绘图使用Graphics,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7081308/

相关文章:

Java 单线程聊天应用程序

java - JPanel设置位置

c++ - 使用 DT_CALCRECT 的 LPD3DXFONT DrawText?

java - Android 中的 Getter 和 Setter 返回 null

java - 如何限制堆栈深度

java - 向 JFrame 添加背景

java - Java JFrame 中的多个移动图形

java - 用于将值插入 Db 的字符串格式

java - 在 Canvas 上以更好的分辨率绘画? (安卓)

r - 如何为曲线包络着色