我正在尝试创建一个程序,允许用户拖动和绘制线条,并在绘制线条后删除它们。我有什么方法可以做到吗?我有绘制线的代码,但我不知道如何在绘制之后删除这些线。我希望点击任何绘制的线条并使用删除按钮将其删除。
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Drawing {
public Drawing() {
JFrame jf=new JFrame("Free Hand Drawing Example");
Board draw=new Board();
jf.add(draw);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setSize(600,500);
jf.setVisible(true);
}
public static void main(String a[]){
new Drawing();
}
}
class Board extends JPanel implements MouseListener,MouseMotionListener {
ArrayList<pts> list = new ArrayList<pts>();
Point start,end;
public Board() {
start=null; /*Initializing*/
end=null;
//this.setBackground(Color.BLACK);
this.addMouseListener(this);
this.addMouseMotionListener(this);
}
@Override
public void paint(Graphics g)
{ Graphics2D g2 = (Graphics2D) g;
g2.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
super.paint(g2);
//g.setColor(Color.BLACK);
for (pts p : list)
g.drawLine((int)p.getStart().getX(), (int)p.getStart().getY(), (int)p.getEnd().getX(), (int)p.getEnd().getY());
if(start!=null)
{
g.drawLine(start.x,start.y,end.x,end.y);
}
}
@Override
public void mouseClicked(MouseEvent arg0) {}
@Override
public void mouseEntered(MouseEvent arg0) {}
@Override
public void mouseExited(MouseEvent arg0) {}
@Override
public void mousePressed(MouseEvent me) {
start = me.getPoint();
}
@Override
public void mouseReleased(MouseEvent me) {
end = me.getPoint();
pts pt = new pts(start,end);
list.add(pt);
repaint();
for(pts p : list)
{
System.out.println(p.getStart()+""+p.getEnd());
}
start = null;
end = null;
}
@Override
public void mouseDragged(MouseEvent me) {
end = me.getPoint();
repaint();
}
@Override
public void mouseMoved(MouseEvent arg0) {}
}
class pts{
Point start = null;
Point end = null;
public pts(Point start, Point end){
this.start = start;
this.end = end;
}
public Point getStart(){
return this.start;
}
public Point getEnd(){
return this.end;
}
}
答案 0 :(得分:2)
不止一种方法可以解决这个问题,但一种简单的方法是添加一个删除&#39;带有ActionListener
的按钮,用于清除按下按钮时的点列表。您还可以将清算操作与MouseDragged
事件相关联,但这看起来并非用户友好。
<强>更新强>: 因此,要在用户点击它时删除该行,您可以使用类似这样的简单函数:
public boolean intersects(Point linePoint1,
Point linePoint2,
Point usersClickPoint) {
return new Line2D.Float(linePoint1, linePoint2).
ptLineDist(usersClickPoint) <= 0.01;//some margin of error
}
在您的MousePressed
方法中。
旁注:您选择解释鼠标事件的方式有点奇怪。您在MousePressed
上记录第一个点,在MouseReleased
上记录第二个点。为什么不使用MouseClicked
并简单地在绘制线条时跟踪第一次和第二次点击?
答案 1 :(得分:0)
一种方法是为用户绘制的每一行创建一个Line对象,并让对象将位置存储在绘制线条的屏幕上。然后,当处于删除模式时,有一个onClickListener,它将根据点击的坐标选择一条线,直到匹配到一行中包含的点。然后删除该行(可能使用相同的端点重绘,但笔设置为背景颜色)。对于线相交并且您不想删除另一条线的一部分的可能情况,需要有一些逻辑,但这可以相当容易地解决。请记住,我不是一个伟大的图形程序员。这只是我的想法。