绘制线条和删除线条

时间:2014-07-14 14:08:54

标签: java graphics2d lines

我正在尝试创建一个程序,允许用户拖动和绘制线条,并在绘制线条后删除它们。我有什么方法可以做到吗?我有绘制线的代码,但我不知道如何在绘制之后删除这些线。我希望点击任何绘制的线条并使用删除按钮将其删除。

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

}

2 个答案:

答案 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,它将根据点击的坐标选择一条线,直到匹配到一行中包含的点。然后删除该行(可能使用相同的端点重绘,但笔设置为背景颜色)。对于线相交并且您不想删除另一条线的一部分的可能情况,需要有一些逻辑,但这可以相当容易地解决。请记住,我不是一个伟大的图形程序员。这只是我的想法。