提问者:小点点

java图形-无法保存绘制的形状


我有一个java的应用程序,我一直在编码,它是一个应用程序,可以让我绘制形状像一个矩形。我的应用程序可以绘制形状,但我不能保存它们,因为当我尝试绘制一个新形状,我点击其他地方之前绘制的形状消失,被一个新的取代。我尝试数组列表来保存我的形状,但它不起作用。

这是我的代码:

    public class Toile extends JPanel {

    Vector<Forme> forme = new Vector<Forme>();
    private Color couleur;
    private int x;
    private int y;
    private int x2;
    private int y2;
    private Oval oval;
    private Rectangl rect;


    public Toile(){
    initComponents();
    }

    public void initComponents(){
   addMouseListener(new java.awt.event.MouseAdapter() { 
   public void mousePressed(java.awt.event.MouseEvent evt) { 
    formMousePressed(evt); } 
     public void mouseReleased(java.awt.event.MouseEvent evt) { 
    formMouseReleased(evt); } }); 
   addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { 
      public void mouseDragged(java.awt.event.MouseEvent evt) { 
    formMouseDragged(evt); } });
    }
    public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(couleur);
    drawfillRect(g, x, y, x2, y2);
    }


    public void setStartPoint(int x, int y) {
    this.x = x;
    this.y = y;
    }

    public void setEndPoint(int x, int y) {
    x2 = (x);
    y2 = (y);
    }

    public void drawfillRect(Graphics g, int x, int y, int x2, int y2) {
        int px = Math.min(x,x2);
        int py = Math.min(y,y2);
        int pw=Math.abs(x-x2);
        int ph=Math.abs(y-y2);
        //g.fillRect(px, py, pw, ph);
        Rectangl rect = new Rectangl(px,y,x2,py,pw,ph,couleur,true);
        rect.dessinerfrect(g);
        forme.add(rect);
      }
 }

       private void formMousePressed(java.awt.event.MouseEvent evt) { 
       setStartPoint(evt.getX(), evt.getY());
      repaint(); 
       }

      private void formMouseReleased(java.awt.event.MouseEvent evt) {{
      setEndPoint(evt.getX(), evt.getY());
      repaint(); 
      //dessiner(this.getGraphics());
      }
      }

      private void formMouseDragged(java.awt.event.MouseEvent evt){{
      setEndPoint(evt.getX(), evt.getY());
      repaint(); 
      //dessiner(this.getGraphics()); 
      }
      }

如您所见,这是进行绘图的类,将要绘制的矩形是来自我创建的类的对象,该类是超类Forme的子类。正如我之前所说,应用程序可以绘制形状,但绘制的形状不会保存。此外,我从我的帖子中删除了getter和setter,因为我想只保留必要的内容,我想让我的帖子更清晰。

这是RecTangl类:

  public class Rectangl extends Forme {
  private int largeur;
  private int hauteur;
  private Rectangle rectangle;
  public Rectangl(int x1,int y1, int x2 ,int y2,int largeur,int hauteur,Color couleur,Boolean plein){
  super(x1,y1,x2,y2,couleur,plein);
  this.largeur = largeur;
  this.hauteur = hauteur;
}

  public void dessinerrect(Graphics g){
  g.setColor(couleur); 
  g.drawRect((int)point1.getX(), (int)point2.getY(), largeur, hauteur);
 }
  public void dessinerfrect(Graphics g){
  g.setColor(couleur); 
  g.fillRect((int)point1.getX(), (int)point2.getY(), largeur, hauteur);
 }

   }

共2个答案

匿名用户

您需要实现一个显示列表。这是一个数据结构,表示当前绘图中的所有项目。组件画家只是遍历列表并绘制每个项目(通常在擦除屏幕后,以便删除的对象不会出现在新绘图中)。如果鼠标已被按下且尚未释放,它还可以选择绘制“橡胶带光标”。鼠标操作(通常释放鼠标按钮只是修改状态变量,包括显示列表(添加、选择、删除等),然后重新绘制绘图表面,以便调用组件画家。

JavaArrayList是实现简单显示列表的合理方式。项目本身是接口和/或继承的经典用法:

interface DisplayListItem {
  void draw(Graphics g);
}

abstract class AbstractRectangle implements DisplayListItem {
  protected int x, y, w, h;
  protected Color color;
  Rectangle(int x, int y, int w, int h, Color color) {
    this.x = x;
    this.y = y;
    this.w = w;
    this.h = h;
    this.color = color;
  }
}

class Rectangle extends AbstractRectangle {
  Rectangle(int x, int y, int w, int h, Color color) { 
    super(x, y, w, h, color);
  }
  @Override
  void draw(Graphic g) {
    g.setColor(color);
    g.drawRect(x, y, w, h);
  }
}
class FilledRectangle extends AbstractRectangle {
  FilledRectangle(int x, int y, int w, int h, Color color) { 
    super(x, y, w, h, color);
  }
  @Override
  void draw(Graphic g) {
    g.setColor(color);
    g.fillRect(x, y, w, h);
  }
}

private List<DisplayListItem> displayList = new ArrayList<>();
private int xPress, yPress, xDrag, yDrag;
private boolean mousePressed = false;

@Override
public void paintComponent(Graphics g) { 
  super.paintComponent(g);
  for (DisplayListItem item : displayList) {
    item.draw(g);
  }
  if (mousePressed) {
   // Draw the click-and-drag cursor.
   g.setColor(Color.RED);
   g.drawRect(xPress, yPress, xDrag - xPress, yDrag - yPress);
  }
}

private void formMousePressed(MouseEvent evt) { 
  xPress = evt.getX();
  yPress = evt.getY();
  mousePressed = true;
}

private void formMouseDragged(MouseEvent evt) {
  if (!mousePressed) return;
  xDrag = evt.getX();
  yDrag = evt.getY();
  repaint();
} 

private void formMouseReleased(MouseEvent evt) {
  if (!mousePressed) return;
  xDrag = evt.getX();
  yDrag = evt.getY();
  // Adding a rectangle to the display list makes it permanent.
  displayList.add(new Rectangle(xPress, yPress, xDrag - xPress, yDrag - yPress));
  mousePressed = false;
  repaint();
}

警告:这是未经编译、未经测试的代码。使用风险自负。

匿名用户

Swing具有有用的Shape接口,该接口已实现为几个可以很好地服务于您的目的的具体类。

有几种不同的Shape(Ellipse2D、RecTangle2D、RoundRecTangle2D)被存储在一个ArrayList的Shape对象中,然后这些被绘制在JPanel的方法中,在第一次将Graphics对象转换成Graphics2D之后。