簡體   English   中英

拖動鼠標時畫線

[英]Draw Line While Dragging The Mouse

我想做的是畫圓和線。

當第一次按下鼠標時,我畫了一個小圓圈。 然后,我需要畫一條連接原點和鼠標當前位置的線 松開鼠標時,線條仍然存在,但是當我再次單擊時,一切都消失了,我重新繪制了一個圓和一條線。

這是我到目前為止的代碼:

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()方法中重新繪制,圓圈會在下一次單擊時進進出出而不是消失。

如果要繪制圓和線,則需要保留要繪制的形狀的 ArrayList。 你會添加一個Ellipse2D.Double為圓和Line2D.Double為線。

mousePressed事件中,您將Ellipse2D.Double對象添加到 ArrayList,然后設置一個臨時Line2D.Double對象來包含您的行信息。

mouseDragged事件更新Line2D.Double使用新的結束點對象,然后調用重繪()。

mouseReleased事件中,您將Line2D.Double對象添加到 ArrayList 並清除引用Line2D.Double對象的變量。

然后在paintComponent() 方法中添加邏輯:

  1. 遍歷ArrayList以繪制每個Shape
  2. 不為空時繪制Line2D.Double對象

查看自定義繪畫方法中Draw On Component示例。 這將向您展示這種方法的基本概念。

在示例中,ArrayList 僅包含有關 Rectangles 的信息,因此您需要使其更通用以保存Shape對象。 無論Ellispse2D.DoubleLine2D.Double實現Shape接口。

對於畫線,我有這個。當您向左單擊鼠標時,您保留一個點,下次單擊將保留另一個點,在它們之間創建一條,用鼠標右鍵,您可以在第一個點和最后一個點之間創建一條線(您可以刪除這個“如果( isClosed)”如果你不想)

另一件事:這不是一個很好的精度,因為 pointlocation 返回一個雙精度值,而繪制線需要一個整數,而轉換會失去精度。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM