Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用图形的JPanel自定义绘图_Java_Swing_Graphics_Jframe_Jpanel - Fatal编程技术网

Java 使用图形的JPanel自定义绘图

Java 使用图形的JPanel自定义绘图,java,swing,graphics,jframe,jpanel,Java,Swing,Graphics,Jframe,Jpanel,我有一个定制的JPanel,有时在我的程序中,我需要调用一个将屏幕涂成黑色的方法,就是这样 public void clearScreen() { Graphics g = getGraphics(); g.setColor(Color.black); g.fillRect(0,0,getWidth(),getHeight()); } 当我启动程序时,我调用这个方法 然而,我发现它有时有效,有时无效。这很奇怪。我还发现,当它不工作时,图形对象不是空的,并且宽度和高度也被

我有一个定制的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来获取图形对象,因为获取的图形对象在下次重新绘制时不会持久(这可能是问题的根源)

相反,考虑在一个缓冲区中做所有的绘图,然后你可以使用GETGRICICS()来满足你的内容。如果这样做,在完成图形对象的绘制时,不要忘了处理它

e、 g


因此,创建一个BuffereImage,然后在JPanel上绘制该BuffereImage?@reising1:请参见演示我的意思的“使用代码编辑”示例。
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
   }
}