拖动鼠标时画线

时间:2018-11-02 14:42:26

标签: java swing graphics mouselistener mousemotionlistener

我想做的是画圆和线。

第一次按下鼠标时,我画了一个小圆圈。那我需要 画一条线将原始点连接到 current 鼠标的位置 。释放鼠标时,该行 仍然存在,但是当我再次单击时,一切都消失了,我画了一个 再圈一圈。

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

drawCircle()

然后,当然,有一个main方法可以创建类对象并将其添加到框架中。

我的两个具体问题是:

  1. 如何在拖动时画一条线?我目前拥有的代码仅在鼠标释放的最后一点画了一条线。
  2. 我何时重新粉刷?如果我使用import numpy as np def myfunc(x): return sum(x) def f( g, x ): if len(x.shape) == 1: return g(x) if len(x.shape) > 1: return np.array( [f(g,v) for v in x] ) # Test with one dimensional input res = f( myfunc, np.array( [0.,1.,2.] ) ) print( res ) # Test with two dimensional input res = f( myfunc, np.array( [[0.,1.,2.],[3.,4.,5.]] ) ) print( res ) # And, still more dimensions res = f( myfunc, np.ones( (3,2,2) ) ) print( res ) 方法重新绘制,则圆圈会闪烁进出,而不是在下次单击时消失。

2 个答案:

答案 0 :(得分:1)

如果要绘制圆和直线,则需要保留一个要绘制的ShapeArray。您将为圆圈添加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对象

查看Custom Painting Approaches中的Draw On Component示例。这将向您展示此方法的基本概念。

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

答案 1 :(得分:0)

对于画线,我有此要求。单击鼠标左键时,您保留,下一次单击将保留另一个点< / strong>在它们之间建立线,并用鼠标右键第一点和< strong>最后一个点(如果您不愿意,可以删除此“ if(isClosed)”)

另一件事:这不是一个很好的精度,因为点位置返回一个double值并且绘制线需要一个整数,并且 cast失去了精度。

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