2014-07-14 1 views
0

사용자가 선을 끌고 그릴 수있는 프로그램을 만들려고하고 또한 그 선을 그려서 삭제합니다. 내가 할 수있는 방법이 있니? 나는 선을 그리는 코드를 가지고 있지만 선을 그린 후에 선을 삭제할 수있는 방법이 확실하지 않습니다. 내가 그려진 선들 중 하나를 클릭하고 삭제 버튼으로 그것을 삭제하고자하는.선 그리기 및 선 삭제

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

이것에 대해 이동하는 하나 개 이상의 방법이 있습니다,하지만 간단한 방법은 버튼을 누를 때이 점의 목록을 지 웁니다 ActionListener와 '삭제'버튼을 추가하는 것입니다. 또한 지우기 작업을 MouseDragged 이벤트와 연결할 수도 있지만 사용자에게 친숙하지는 않습니다.

UPDATE : 그래서, 사용자가 클릭 할 때 줄을 삭제하기 위해, 당신은이 같은 간단한 기능을 사용할 수 있습니다 : 당신의 MousePressed 방법

public boolean intersects(Point linePoint1, 
          Point linePoint2, 
          Point usersClickPoint) { 
    return new Line2D.Float(linePoint1, linePoint2). 
     ptLineDist(usersClickPoint) <= 0.01;//some margin of error 
} 

.

사이드 노트 : 마우스 이벤트를 해석하는 방식은 약간 이상합니다. 첫 번째 점은 MousePressed에 기록하고 두 번째 점은 MouseReleased에 기록합니다. MouseClicked을 사용하지 않고 선을 그릴 때 첫 번째 및 두 번째 클릭을 추적하십시오.

+0

안녕하세요, 미안 해요 나는 라인을 클릭하고 라인을 삭제하려고하는 것을 추가하는 것을 잊어 버렸습니다. 이 방법이 있습니까? – user1823986

+0

답장을 보내 주셔서 감사합니다. 내가 마우스를 누른 채 마우스를 놓은 이유는 드래그하여 마우스를 놓는 선을 그려야하기 때문입니다. – user1823986

+0

@Amir'MouseDragged'에 그려진 선을 "미리보기"하고 싶다면 선 만들기를 위해'MouseClick'을 가로 채는 것은 나쁜 생각 일 수 있습니다 ... – AlexR

0

한 가지 방법은 사용자가 그린 각 선에 대해 Line 개체를 만들고 개체에 선이 그려지는 위치를 저장하도록하는 것입니다. 그런 다음 삭제 모드에서 선에 포함 된 점까지 일치하는 클릭 좌표를 기반으로 선을 선택하는 onClickListener를 갖습니다. 그런 다음 선을 지우십시오 (동일한 끝점을 사용하지만 배경색으로 설정된 펜으로 다시 그릴 수 있음). 선이 교차하고 다른 선의 일부를 지우고 싶지 않은 경우에 대해 약간의 논리가 필요하지만 상당히 쉽게 해결할 수 있습니다. 마음에, 나는 큰 그래픽 프로그래머가 아니야. 이것은 단지 제 생각입니다.

+0

답장을 보내 주셔서 감사합니다. 이 생각하고 있었지만 만약 내가 주위에 드래그 수있는 2 개체 사이의 커넥터로 그것을 사용했다면, 잘 적용되는지 모르겠다. – user1823986