我想做的是画圆和线。
第一次按下鼠标时,我画了一个小圆圈。那我需要 画一条线将原始点连接到 current 鼠标的位置 。释放鼠标时,该行 仍然存在,但是当我再次单击时,一切都消失了,我画了一个 再圈一圈。
这是我到目前为止的代码:
drawCircle()
然后,当然,有一个main方法可以创建类对象并将其添加到框架中。
我的两个具体问题是:
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 )
方法重新绘制,则圆圈会闪烁进出,而不是在下次单击时消失。答案 0 :(得分:1)
如果要绘制圆和直线,则需要保留一个要绘制的ShapeArray。您将为圆圈添加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
对象查看Custom Painting Approaches中的Draw On Component
示例。这将向您展示此方法的基本概念。
在该示例中,ArrayList仅包含有关矩形的信息,因此您需要使其更通用以容纳Shape
对象。 Ellispse2D.Double
和Line2D.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();
}