图形在JFrame中保持重置

时间:2016-06-02 18:51:56

标签: java jframe

我最近开始使用Java,现在我遇到了一个简单的项目。我想绘制一条线,但是当我绘制另一条线时,第一条线就消失了。我不知道如何得到它所以我可以继续绘制线条。 这是我的代码:

package com.example.paint;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class ClickEvent extends MouseAdapter {
    private Paint paint;

    boolean click = false;
    boolean clear = false;

    int startX;
    int startY;
    int endX;
    int endY;
    int firstTime = 1;

    public ClickEvent(Paint paint, Handler handler, Line line) {
        this.paint = paint;
    }

    public void mousePressed(MouseEvent e) {
        int mx = e.getX();
        int my = e.getY();
        if (mouseOver(mx, my, 750, 560, 83, 40)) {
            clear = true;
        }
        if (mouseOver(mx, my, 0, 0, 40, 40)) {
            paint.color = "Black";
        }
        if (mouseOver(mx, my, 0, 40, 40, 40)) {
            paint.color = "Blue";
        }
        if (mouseOver(mx, my, 0, 80, 40, 40)) {
            paint.color = "Green";
        }
        if (mouseOver(mx, my, 0, 120, 40, 40)) {
            paint.color = "Red";
        }
        if (!mouseOver(mx, my, 0, 0, 40, 160) && !mouseOver(mx, my, 750, 560, 83, 40)) {
            clear = false;
            startX = mx;
            startY = my;
            click = true;
        }
    }

    public void mouseReleased(MouseEvent e) {
        int mx = e.getX();
        int my = e.getY();
        if (!mouseOver(mx, my, 0, 0, 40, 160) && !mouseOver(mx, my, 750, 560, 83, 40)) {
            endX = mx;
            endY = my;
            click = false;
        }
    }

    private boolean mouseOver(int mx, int my, int x, int y, int width, int height) {
        if (mx > x && mx < x + width) {
            if (my > y && my < y + height) {
                return true;
            } else
                return false;
        } else
            return false;
    }

    public void tick() {
    }

    public void render(Graphics g) {
        Font font = new Font("Arial", 1, 30);
        Font font1 = new Font("Arial", 1, 13);

        g.setColor(Color.black);
        g.fillRect(0, 0, 40, 40);

        g.setColor(Color.blue);
        g.fillRect(0, 40, 40, 40);

        g.setColor(Color.green);
        g.fillRect(0, 80, 40, 40);

        g.setColor(Color.red);
        g.fillRect(0, 120, 40, 40);

        g.setColor(Color.black);
        g.drawRect(750, 560, 83, 40);
        g.setFont(font);
        g.drawString("Clear", 755, 590);

        g.setFont(font1);
        if (paint.color == "Red") {
            g.setColor(Color.red);
            g.drawString("Color: " + paint.color, 745, 15);
        } else if (paint.color == "Blue") {
            g.setColor(Color.blue);
            g.drawString("Color: " + paint.color, 745, 15);
        } else if (paint.color == "Green") {
            g.setColor(Color.green);
            g.drawString("Color: " + paint.color, 745, 15);
        } else if (paint.color == "Black") {
            g.setColor(Color.black);
            g.drawString("Color: " + paint.color, 745, 15);
        } else {
            g.setColor(Color.black);
            g.drawString("Color: ", 745, 15);
        }
        if (!clear) {
            if ("Red".equals(paint.color) && !click) {
                g.setColor(Color.red);
                g.drawLine(startX, startY, endX, endY);
            } else if ("Green".equals(paint.color) && !click) {
                g.setColor(Color.green);
                g.drawLine(startX, startY, endX, endY);
            } else if ("Blue".equals(paint.color) && !click) {
                g.setColor(Color.blue);
                g.drawLine(startX, startY, endX, endY);
            } else if ("Black".equals(paint.color) && !click) {
                g.setColor(Color.black);
                g.drawLine(startX, startY, endX, endY);
            }
        }
    }
}

有些代码是基础教程的一部分,但其余的我尝试自己做。如果有人知道如何让它继续绘制线条,或者如果有人有任何其他改进,我会非常感激。

1 个答案:

答案 0 :(得分:0)

问题是你只能保存一行以便以startX, startY, endX, endY的形式进行绘制。

相反,您可以在每次单击结束时将该行保存为新的线对象。像这样:

class MyLine {
    private final int startX, startY;
    private final int endX, endY;
    private final Color color;

    public MyLine(int startX, int startY, int endX, int endY, Color color) {
        this.startX = startX;
        this.startY = startY;
        this.endX = endX;
        this.endY = endY;
        this.color = color;
    }

    public void draw(Graphics g) {
        g.setColor(color);
        g.drawLine(startX, startY, endX, endY);
    }
}

将列表作为字段添加到您的班级:

List<MyLine> lineList = new ArrayList<>();

然后,在mouseReleased方法中,向列表中添加一个新行:

if (!mouseOver(mx, my, 0, 0, 40, 160) && !mouseOver(mx, my, 750, 560, 83, 40)) {
    endX = mx;
    endY = my;
    click = false;
    lineList.add(new MyLine(startX, starY, endX, endY, paint.color));
}

此外,您必须更改Paint,以便将颜色保留为Color对象:

class Paint {
    public Color color;
    ...
}
~~~~
paint.color = Color.black;

这比保存字符串容易得多。

最后,在render方法中循环遍历所有线条以绘制它们:

for(MyLine l : lineList) {
    l.draw(g);
}