Изображение с буферизацией на Java, поверх вопроса JPanel - PullRequest
0 голосов
/ 04 октября 2011

Итак, вот моя проблема, мой профессор заставляет нас составить программу рисования, в которой мы выбираем предмет и рисуем его. Однако проблема в том, что он хочет, чтобы мы нарисовали буферизованное изображение, а затем поместили его поверх JPanel.

На данный момент почти все работает, вы можете выбрать одну из кнопок, которые я настроил, вы можете нарисовать прямоугольник и изменить размер рамки. Когда вы сделаете это, изображение прямоугольника не исчезнет и JPanel расширится. Однако буферизованное изображение не будет расширяться, вы можете увидеть в коде, что в моем методе paintComponent я создаю буферизованное изображение, если сетка == ноль, и если это так, то это создает изображение шириной и высотой моей доски. Когда я пытаюсь добавить вызов к этому методу в любое другое время, он не изменяет размер, так как сетка больше не равна нулю. Я не знаю, как вызвать изменение размера буферизованного изображения.

Любые идеи были бы великолепны!

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();
  }

}

1 Ответ

1 голос
/ 04 октября 2011

Сделайте BufferedImage размером с рабочий стол, тогда вам не нужно беспокоиться об изменении размера.

Или добавьте ComponentListener на панель. Когда размер компонента изменится, создайте новый BufferedImage, чтобы отразить новый размер панели. Затем нарисуйте старое буферизованное изображение на новом. Конечно, при таком подходе данные будут потеряны, если панель сжимается, а затем снова увеличивается.

...