我想要做的是绘制圆圈和线条。
首次按下鼠标时,我画了一个小圆圈。然后,我需要绘制一条连接原始点到鼠标当前位置的线。当鼠标被释放时,线条仍然存在,但是当我再次点击时,一切都消失了,我又画了一个圆圈和一条线。
这是我到目前为止的代码:
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);
}
}
然后,当然,有一个主方法创建类对象并将其添加到框架和诸如此类的东西。
我的两个具体问题是:
drawCircle()
方法重新绘制,圆圈会闪烁进出而不是在下一次单击时消失。如果要绘制圆和直线,则需要保留要绘制的形状的ArrayList。你可以为圆圈添加一个Ellipse2D.Double
,为该线添加一个Line2D.Double
。
在mousePressed
事件中,您将Ellipse2D.Double
对象添加到ArrayList,然后设置临时Line2D.Double
对象以包含您的行信息。
在mouseDragged
事件中,您使用新的结束点更新Line2D.Double
对象,然后调用repaint()。
在mouseReleased
事件中,您将Line2D.Double
对象添加到ArrayList并清除引用Line2D.Double
对象的变量。
然后在paintComponent()方法中添加逻辑:
ArrayList
画每个Shape
。Line2D.Double
对象查看Draw On Component
中的Custom Painting Approaches示例。这将向您展示这种方法的基本概念。
在示例中,ArrayList仅包含有关Rectangles的信息,因此您需要使其更通用以容纳Shape
对象。 Ellispse2D.Double
和Line2D.Double
都实现了Shape
界面。
对于绘制线我有这个。当你单击鼠标左键时你保留一个点下一个点击将保留另一个点在它们之间划一条线,并且用鼠标右键你在第一个点和最后一个点之间划线(你可以删除这个“如果( 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();
}