Рисовать линии при перетаскивании мыши - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь нарисовать круги и линии.

При первом нажатии мыши я рисую маленький круг. Тогда мне нужно провести линию, соединяющую исходную точку с током положение мыши . Когда мышь отпущена, линия остается, но когда я нажимаю снова, все исчезает, и я рисую круг и линия снова и снова.

Это код, который у меня есть:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;    

public class Canvas4 extends JComponent implements MouseListener, MouseMotionListener {

    //constructor
    public Canvas4() {
        super();
        addMouseListener(this);
        addMouseMotionListener(this);
    }

    //some variables I may or may not use
        int pressedX;
        int pressedY;
        int currentX;
        int currentY;
        int startDragX;
        int startDragY;
        int endDragX;
        int endDragY;
        int mouseReleasedX;
        int mouseReleasedY;



    //mouse events
    public void mouseClicked(MouseEvent event)  {  }

    public void mouseEntered(MouseEvent event)  {  }

    public void mouseExited(MouseEvent event)   {  }

    public void mousePressed(MouseEvent event)  {  
        pressedX = event.getX();
        pressedY = event.getY(); 
        drawCircle();

        startDragX = pressedX;
        startDragY = pressedY;
    }

    public void mouseReleased(MouseEvent event) {  
        mouseReleasedX = event.getX();
        mouseReleasedY = event.getY();
        //repaint() here maybe???
    }



    //mouse motion events
    public void mouseDragged(MouseEvent event) {
        System.out.println("You dragged the mouse.");
        endDragX = event.getX();
        endDragY = event.getY();
        drawLine();

    }

    public void mouseMoved(MouseEvent event) {  }



    //draw circle when mouse pressed
    //this method works fine
    public void drawCircle()    {
        Graphics g1 = this.getGraphics();
        g1.setColor(Color.CYAN);
        g1.fillOval(pressedX, pressedY, 10, 10);    
    }

    //draw line when mouse dragged
    //this is where I need help
    public void drawLine()  {
        Graphics g2 = this.getGraphics();
        g2.setColor(Color.RED);
        g2.drawLine(pressedX, pressedY, mouseReleasedX, mouseReleasedY);
    }
}

Затем, конечно, есть метод main, который создает объект класса и добавляет его в кадр и еще много чего.

Мои два конкретных вопроса:

  1. как нарисовать линию, когда она перетаскивается? Код, который у меня есть на данный момент, рисует линию только до последней точки отпускания мыши.
  2. Когда мне перекрасить? Если я перекрашиваю в методе drawCircle(), круг мигает, а не исчезает при следующем щелчке.

Ответы [ 2 ]

0 голосов
/ 24 марта 2019

Для рисования линий У меня есть это. Когда вы нажимаете мышь, оставленную , вы сохраняете точку , следующий щелчок сохранит другую точку , делая линия между ними, и мышь вправо делает линию между первой точкой и последней точкой ( Вы можете удалить это "если (isClosed)", если вы не хотите)

Другое дело: это не очень хорошая точность, потому что pointlocation возвращает double, а drawline требует целое число, а приведение теряет точность.

public class PolygonOnClick extends JPanel implements MouseListener, MouseMotionListener {
ArrayList<Point> points = new ArrayList<>();
static boolean isClosed = false;

PolygonOnClick() {
    JFrame frame = new JFrame("Polygon ON CLICK");
    frame.addMouseListener(this);
    frame.setLocation(80, 50);
    frame.setSize(1000, 700);
    frame.add(this);
    frame.setResizable(false);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}

public void paintComponent(Graphics graphics) {
    super.paintComponent(graphics);
    graphics.drawString("Click stanga pentru a incepe a desena , click dreapta pentru a inchide poligonul ", 15, 15);

    for (int i = 1; i < points.size(); i++) {
        graphics.drawLine((int) points.get(i - 1).getX(), (int) points.get(i - 1).getY(), (int) points.get(i).getX(), (int) points.get(i).getY());
    }
    if (isClosed) {
        graphics.drawLine((int) points.get(points.size() - 1).getX(), (int) points.get(points.size() - 1).getY(), (int) points.get(0).getX(), (int) points.get(0).getY());
    }
}

@Override
public void mousePressed(MouseEvent e) {
    if (!isClosed) {
        if (e.getButton() == MouseEvent.BUTTON1) {
            points.add(e.getPoint().getLocation());
        }
    }
    if (e.getButton() == MouseEvent.BUTTON3) {
        isClosed = true;
    }
    repaint();
}
0 голосов
/ 03 ноября 2018

Если вы хотите рисовать круги и линии, вам нужно сохранить ArrayList of Shapes для рисования. Вы бы добавили Ellipse2D.Double для круга и Line2D.Double для линии.

В событии mousePressed вы добавляете объект Ellipse2D.Double в ArrayList, а затем настраиваете временный объект Line2D.Double для хранения информации о вашей строке.

В событии mouseDragged вы обновляете объект Line2D.Double новой конечной точкой и затем вызываете repaint ().

В событии mouseReleased вы добавляете объект Line2D.Double в ArrayList и очищаете переменную, ссылающуюся на объект Line2D.Double.

Затем в методе paintComponent () вы добавляете логику для:

  1. итерация по ArrayList для рисования каждого Shape.
  2. рисует объект Line2D.Double, когда не ноль

Ознакомьтесь с примером Draw On Component, приведенным в Пользовательские подходы к рисованию Это покажет вам основную концепцию этого подхода.

В этом примере ArrayList содержит только информацию о прямоугольниках, поэтому вам нужно сделать его более общим для хранения объекта Shape. И Ellispse2D.Double, и Line2D.Double реализуют интерфейс Shape.

...