Java Swing-如何在画布中绘制新线条并将其添加到现有线条中



我已经在Java Swing中的哥本哈根制作了一张地图,但是我希望能够在地图上画新的行,然后将它们添加到现有行,我从我的缓冲读者那里求助。我尝试将新的绘制线添加到临时行的阵列列表中,但这似乎不起作用 - 我根本无法再绘制画布了。谁能帮忙?

public class Model extends Observable implements Iterable<Line2D>, Serializable {
    private List<Line2D> lines;
    private List<Line2D> tmpLines;
    public Model() {
        lines = new ArrayList<>();
        tmpLines = new ArrayList<>();
    }
    public Model(String filename) {
        readFromFile(filename);
    }
    public void add(Line2D line) {
        lines.add(line);
        dirty();
    }
    public void dirty() {
        setChanged();
        notifyObservers();
    }
    public void readFromFile(String filename) {
        lines = new ArrayList<>();
        tmpLines = new ArrayList<>();
        try {
            BufferedReader b = new BufferedReader(new FileReader(filename));
            for (String line = b.readLine(); line != null; line = b.readLine() ) {
                String[] tokens = line.split(" ");
                if (tokens[0].equals("LINE")) {
                    double x1 = Double.parseDouble(tokens[1]);
                    double y1 = Double.parseDouble(tokens[2]);
                    double x2 = Double.parseDouble(tokens[3]);
                    double y2 = Double.parseDouble(tokens[4]);
                    lines.add(new Line2D.Double(x1, y1, x2, y2));
                }
            }
        } 
        catch (FileNotFoundException e) {
            e.printStackTrace();
        } 
        catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * Returns an iterator over elements of type {@code T}.
     *
     * @return an Iterator.
     */
    @Override
    public Iterator<Line2D> iterator() {
        return lines.iterator();
    }
    public Line2D removeLastFromTmpLines() {
        Line2D line = tmpLines.remove(tmpLines.size() - 1);
        dirty();
        return line;
    }
    public Line2D removeLastFromLines() {
        Line2D line = lines.remove(lines.size() - 1);
        dirty();
        return line;
    }
    public void addTmpLinesToLines() {
        lines.addAll(tmpLines);
        dirty();
    }
    public void addToTmpLines(Line2D line2D) {
        tmpLines.add(line2D);
        dirty();
    }
    public List<Line2D> getTmpLines() {
        return tmpLines;
    }
}
public class MouseController extends MouseAdapter {
    private Model model;
    private CanvasView canvas;
    private Point2D lastMousePosition;
    public MouseController(CanvasView c, Model m) {
        canvas = c;
        model = m;
        canvas.addMouseListener(this);
        canvas.addMouseWheelListener(this);
        canvas.addMouseMotionListener(this);
    }
    @Override
    public void mouseDragged(MouseEvent e) {
        Point2D currentMousePosition = e.getPoint();
        if (canvas.inDrawingMode()) {
            Point2D origin = model.removeLastFromTmpLines().getP1();
            model.addToTmpLines(new Line2D.Double(origin, canvas.toModelCoords(currentMousePosition)));
        }
        else {
            double dx = currentMousePosition.getX() - lastMousePosition.getX();
            double dy = currentMousePosition.getY() - lastMousePosition.getY();
            canvas.pan(dx, dy);
        }
        lastMousePosition = currentMousePosition;
    }
    @Override
    public void mousePressed(MouseEvent e) {
       lastMousePosition = e.getPoint();
       if (canvas.inDrawingMode()) {
           model.addToTmpLines(new Line2D.Double(
               canvas.toModelCoords(lastMousePosition),
               canvas.toModelCoords(lastMousePosition)));
       }
    }
    public void mouseMoved(MouseEvent e) {
        Point2D modelCoords = canvas.toModelCoords(e.getPoint());
        //System.out.println("Screen: [" + e.getX() + ", " + e.getY() + "], "+"Model: [" + modelCoords.getX() + ", " + modelCoords.getY() + "]");
    }

    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        double factor = pow(1.1, e.getWheelRotation());
        canvas.zoom(factor, -e.getX(), -e.getY());
    }
}

说实话,我不太了解代码,因为我看不到油漆方法,所以我看不到您对数组的处理方式。我认为您在列表中添加行,并使用迭代方法将它们返回到油漆方法中。

我认为当按下鼠标按钮时,您会添加一个点,而不是行:

model.addToTmpLines(new Line2D.Double(
               canvas.toModelCoords(lastMousePosition),
               canvas.toModelCoords(lastMousePosition)));

一个点,因为坐标相同。然后,当拖动鼠标时,您会删除最后一行(点(,然后从点的起始坐标添加新线条到实际鼠标位置。这样对吗?但是,您什么时候将直线从TMP列表传递给真实列表?您不需要一种慕斯释放方法才能将线条从TMP列表传递到真实列表吗?迭代器方法仅返回列表行,因此我认为最后一行,拖动的行,没有绘制,因为实际的新行在TMPlines列表中,并且未返回。

但我认为我没有看到整个图片,所以我的评论可能无用...

最新更新