Java缓冲图像,在JPanel问题之上



我的问题是,我的教授让我们做一个绘画程序,我们选择一个项目并在它上面画画。然而,问题是,他希望我们绘制缓冲图像,然后在JPanel的顶部。

到目前为止,几乎所有的东西都可以工作,你可以选择我设置的一个按钮,你可以画一个矩形并调整框架的大小。当你这样做的时候,矩形的图像不会消失,JPanel会扩展。然而,缓冲的图像不会扩展,你可以在代码中看到,在我的paintComponent方法,我做一个缓冲的图像,如果网格== null,如果是,然后它创建一个图像的宽度和高度我的板。当我尝试在任何其他时间添加对该方法的调用时,它不会调整大小,因为网格不再等于null。我不知道如何在缓冲图像上调用调整大小。

任何想法都会很棒!

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

/**
 *
 * @author Calvin Moss
 */
public class Drawing extends JPanel implements MouseListener
{
  public int x1, x2 ,y1, y2;
  public static Drawing instance;
  BufferedImage grid;
  static Graphics2D gc;
  Drawing()
  {
    setBackground(Color.RED);
    addMouseListener(this);
  }
  public static Drawing getInstance()
  {
    if(instance == null)
      instance =  new Drawing();
    return instance;      
  }
  public void paintComponent(Graphics g)
  {     
    super.paintComponent(g);  
    Graphics2D g2 = (Graphics2D)g;
    int w = Board.getInstance().getWidth();
    int h = Board.getInstance().getHeight(); 
    if(grid == null)
    {
      grid = (BufferedImage)(this.createImage(w,h));
      gc = grid.createGraphics();
      gc.setColor(Color.BLUE);
      BufferedImage grid;
      Graphics2D gc;
    }
    g2.drawImage(grid, null, 0, 0);
    check();
  }
  public void draw()
  {
    Graphics2D g = (Graphics2D)getGraphics();
    int w = x2 - x1;
    if (w<0)
      w = w *(-1);
    int h = y2-y1;
    if (h<0)
      h=  h*(-1);
    switch(Main.choice)
    {      
      case 1:
      {
        System.out.println("double gay");
        gc.drawLine(x1, y1, x2, y2);
        repaint();
        break;
      }
      case 2:
      {
        check();
        System.out.println("quad gay");
        gc.drawRect(x1, y1, w, h);
        repaint();
        break;
      }
    }
  }
  public void check()
  {
    if (x1 > x2)
    {
      int z = 0;
      z = x1;
      x1 = x2;
      x2 =z;
    }
    if (y1 > y2)
    {
      int z = 0;
      z = y1;
      y1 = y2;
      y2 = z;
    }
  }
  public void mouseExited(MouseEvent e){}
  public void mouseEntered(MouseEvent e){}
  public void mouseClicked(MouseEvent e){ 
    System.out.println("Gay");
  }
  public void mousePressed(MouseEvent evt)
  {
    x1 = evt.getX();
    y1= evt.getY();
  }
  public void mouseReleased(MouseEvent evt)
  {
    x2 = evt.getX();
    y2 = evt.getY();
    draw();
  }
}

将BufferedImage设置为桌面的大小,那么您就不必担心调整大小了。

或者,向面板添加一个ComponentListener。当组件调整大小时,创建一个新的BufferedImage来反映新的面板大小。然后将旧的缓冲图像绘制到新的图像上。当然,使用这种方法,如果面板缩小,然后再次增大,则数据将丢失。

最新更新