2017-07-25 48 views
0

我有一个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的。如前所述,应用程序可以绘制形状,但绘制的形状不会保存。此外,我从我的帖子中删除了获得者和安装者,因为我只想保留必要的内容,并且希望让我的帖子更清晰。

这里是类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); 
} 

    } 
+1

绘画是破坏性的,当调用paintComponent'时,我们希望从头开始重新绘制整个状态,这意味着你需要一些方法来存储你想要绘制的形状,可能是某种'List' – MadProgrammer

回答

0

Swing也已落实到一些具体的类,这样就能满足你的目的也有用Shape接口。

有几种不同的形状(Ellipse2D的,矩形,的RoundRectangle2D)被存储在图形对象的ArrayList,然后这些经过第一铸造图形对象到一个Graphics2D的JPanelpaintComponent方法中绘制。

0

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

Java ArrayList是一种合理的方法。实现一个简单的显示列表中的项目本身是一个经典的使用接口和/或继承:

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

警告:。这是未编译的,未经测试的代码中使用您自己的风险