Рисование от руки на Яве - PullRequest
       67

Рисование от руки на Яве

0 голосов
/ 21 октября 2011

Я писал эту маленькую программу для рисования, но всякий раз, когда я отпускаю мышь и двигаюсь в другую точку на экране, там рисуется линия.Я попытался очистить точки, когда мышь была отпущена, но это удаляет все на экране.

import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;

public class PaintingCanvas extends Canvas implements MouseMotionListener, MouseListener {

    private ArrayList<Point> points = new ArrayList<Point>();

    public PaintingCanvas(int width, int height) {
        setBounds(0, 0, width, height);
        addMouseMotionListener(this);
        addMouseListener(this);
    }

    public void paint(Graphics g) {

        for (int i = 0; i < points.size() - 2; i++) {
            Point p1 = points.get(i);
            Point p2 = points.get(i + 1);
            g.drawLine(p1.x, p1.y, p2.x, p2.y);
        }

    }

    @Override
        public void mouseDragged(MouseEvent e) {
        points.add(e.getPoint());
        repaint();
    }

}

Ответы [ 6 ]

2 голосов
/ 21 октября 2011

Я предлагаю:

  • Сначала вызовите метод super.paint(g); в вашем методе рисования.
  • Когда мышь отпущена, закрасьте изображение, представленное точками ArrayList, вBufferedImage и затем очистите точки ArrayList, а затем вызовите repaint().
  • Нарисуйте BufferedImage в методе рисования.перед рисованием линий (но сначала убедитесь, что оно не равно нулю).Вы делаете это с помощью метода Graphics#drawImage(Image image, int x, int y, ...).
  • Лучше переписать это, чтобы работать в Swing, рисуя в JPanel's paintComponent метод.
1 голос
/ 17 марта 2012
private void jPanel1MouseDragged(java.awt.event.MouseEvent evt) {
    points.add(evt.getPoint());

    for (int i = 0; i < points.size() - 2; i++)
    {
         Point p1 = points.get(i);
         Point p2 = points.get(i + 1);

       jPanel1.getGraphics().drawLine(p1.x, p1.y, p2.x, p2.y);
    }

}
private void jPanel1MousePressed(java.awt.event.MouseEvent evt) {
    points.clear();
    points.add(evt.getPoint());
}
1 голос
/ 21 октября 2011

Вы смотрели на классы Path?Если вы просто рисуете отдельные линии на экране, класс GeneralPath может быть простым решением.

В руководстве Рисование произвольных фигур объясняется, как их использовать.

По сути, каждый раз, когда пользователь нажимает мышь (при событии mousePressed), вы вызываете метод пути moveTo(x, y).Для каждого сегмента (заменив то, что вы в настоящее время делаете в методе mouseDragged()), вы должны вызывать метод пути lineTo(x, y).

Независимо от того, что вам - определенно - нужно обрабатывать mousePressed или mouseReleased события или оба, так как вы ищете какой-то способ указать начало новой строки / пути, а не использовать старую.

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

Конечно, это происходит - как только вы начинаете рисовать снова, новые точки добавляются после старых. Как только вы рисуете после этого, они включены. Вам нужно будет отделить разные пути друг от друга.

0 голосов
/ 05 декабря 2014

Вставьте точку мусора -1,-1 в points внутри mouseReleased метода и проверьте его внутри paint метода и пропустите эту точку.Обновленный код:

@Override   
public void mouseReleased(MouseEvent e) {

    points.add(new Point(-1, -1));

}

@Override 
public void paint(Graphics g) {

    for (int i = 0; i < points.size() - 1; i++) {

        Point p = points.get(i+1);

        int x2 = p.x;
        int y2 = p.y;

        if ( x2 == -1 || y2 == -1) {
            ++i;
            //continue // Considered bad practice, can play havoc with your system. (source http://xkcd.com/292/ ).
        }
        else {
            p = points.get(i);
            int x1 = p.x;
            int y1 = p.y;
            g.drawLine(x1, y1, x2, y2);
        }
    }
}

ОП, каково это видеть этот вопрос через 3 года?: D

0 голосов
/ 21 октября 2011

Я бы сделал 2d-массив, в котором первый массив - это точки, к которым добавляются точки, пока вы не поднимите палец, затем добавится новый массив для второй строки и т. Д. *

...