[英]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 方法可以創建類對象並將其添加到框架等等。
我的兩個具體問題是:
drawCircle()
方法中重新繪制,圓圈會在下一次單擊時進進出出而不是消失。如果要繪制圓和線,則需要保留要繪制的形狀的 ArrayList。 你會添加一個Ellipse2D.Double
為圓和Line2D.Double
為線。
在mousePressed
事件中,您將Ellipse2D.Double
對象添加到 ArrayList,然后設置一個臨時Line2D.Double
對象來包含您的行信息。
在mouseDragged
事件更新Line2D.Double
使用新的結束點對象,然后調用重繪()。
在mouseReleased
事件中,您將Line2D.Double
對象添加到 ArrayList 並清除引用Line2D.Double
對象的變量。
然后在paintComponent() 方法中添加邏輯:
ArrayList
以繪制每個Shape
。Line2D.Double
對象查看自定義繪畫方法中的Draw On Component
示例。 這將向您展示這種方法的基本概念。
在示例中,ArrayList 僅包含有關 Rectangles 的信息,因此您需要使其更通用以保存Shape
對象。 無論Ellispse2D.Double
和Line2D.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.