【问题标题】:Drawing lines and deleting lines画线和删除线
【发布时间】:2014-07-14 14:08:53
【问题描述】:

我正在尝试创建一个程序,允许用户拖动和绘制线条,并在绘制线条后删除线条。有什么办法可以做到吗?我有画线的代码,但我不确定如何在画线后删除线。我希望单击任何绘制的线条并使用删除按钮将其删除。

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

}

【问题讨论】:

    标签: java graphics2d lines


    【解决方案1】:

    解决此问题的方法不止一种,但一种简单的方法是添加一个带有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 并在绘制线条时简单地跟踪第一次和第二次点击?

    【讨论】:

    • 嗨,对不起,我忘记添加我正在尝试单击该行并删除该行。有什么办法吗?
    • 非常感谢您的回复。我之所以使用鼠标按下和鼠标释放是因为我想通过拖动和释放鼠标来绘制一条线。
    • @Amir 如果您想“预览”在MouseDragged 上绘制的线条,截取MouseClick 以创建线条可能不是一个好主意...
    • 当然,但他从来没有说过任何关于预览的事情。一旦明确了意图,我可以想到很多为什么做某事是一个坏主意的原因。
    【解决方案2】:

    一种方法是为用户绘制的每条线创建一个 Line 对象,并让该对象存储屏幕上绘制线的位置。然后在删除模式下,有一个 onClickListener 将根据单击的坐标选择一条线,该坐标与一条线中包含的点匹配。然后只需删除该线(可能可以使用相同的端点重绘,但将笔设置为背景颜色)。对于线相交并且您不想删除另一条线的一部分的可能情况,需要一些逻辑,但这可以很容易地解决。请记住,我不是一个大的图形程序员。这只是我的想法。

    【讨论】:

    • 感谢您的回复。正在考虑这一点,但如果我将它用作 2 个可以拖动的对象之间的连接器,我不确定它是否适用。
    猜你喜欢
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多