1

我想做的是画圆和线。

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

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

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(),圆圈会闪烁,而不是在下次单击时消失。
4

2 回答 2

1

如果要绘制圆和线,则需要保留要绘制的 ArrayList 形状。您将为Ellipse2D.Double圆添加一个,Line2D.Double为线条添加一个。

如果mousePressed您将Ellipse2D.Double对象添加到 ArrayList,那么您将设置一个临时Line2D.Double对象来包含您的行信息。

如果您使用新的端点mouseDragged更新对象,然后调用 repaint()。Line2D.Double

如果mouseReleased您将Line2D.Double对象添加到 ArrayList 并清除引用该Line2D.Double对象的变量。

然后在 paintComponent() 方法中添加逻辑:

  1. 遍历ArrayList以绘制每个Shape.
  2. Line2D.Double不为空时绘制对象

查看自定义绘画方法Draw On Component中的示例。这将向您展示这种方法的基本概念。

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

于 2018-11-03T02:37:01.087 回答
0

对于画线,我有这个。当您单击鼠标左键时,您会保留一个点,下一次单击将保留另一个点,在它们之间形成一条线,用鼠标右键您可以在第一个点和最后一个点之间画线(您可以删除此“如果( isClosed)”如果你不想)

另一件事:这不是一个很好的精度,因为点定位返回一个双精度值,而绘制线需要一个整数,并且演员表失去了精度。

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();
}
于 2019-03-24T20:45:10.947 回答