拖动鼠标时画线

问题描述 投票:1回答:2

我想要做的是绘制圆圈和线条。

首次按下鼠标时,我画了一个小圆圈。然后,我需要绘制一条连接原始点到鼠标当前位置的线。当鼠标被释放时,线条仍然存在,但是当我再次点击时,一切都消失了,我又画了一个圆圈和一条线。

这是我到目前为止的代码:

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

然后,当然,有一个主方法创建类对象并将其添加到框架和诸如此类的东西。

我的两个具体问题是:

  1. 如何拖动它画一条线?我目前的代码只画了鼠标释放的最后一点。
  2. 我什么时候重画?如果我用drawCircle()方法重新绘制,圆圈会闪烁进出而不是在下一次单击时消失。
java swing graphics mouselistener mousemotionlistener
2个回答
1
投票

如果要绘制圆和直线,则需要保留要绘制的形状的ArrayList。你可以为圆圈添加一个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中的Custom Painting Approaches示例。这将向您展示这种方法的基本概念。

在示例中,ArrayList仅包含有关Rectangles的信息,因此您需要使其更通用以容纳Shape对象。 Ellispse2D.DoubleLine2D.Double都实现了Shape界面。


0
投票

对于绘制线我有这个。当你单击鼠标左键时你保留一个点下一个点击将保留另一个点在它们之间划一条线,并且用鼠标右键你在第一个点和最后一个点之间划线(你可以删除这个“如果( 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();
}
© www.soinside.com 2019 - 2024. All rights reserved.