2012-04-09 2 views
2

'lines'라는 Line Objects의 ArrayList가 있습니다. 몇 가지 제약 조건이있는 선을 그릴 수있는 자체 선 클래스를 만들었습니다. 패널에서 두 점을 선택하고 두 점을 연결하는 선이 그려집니다. 선이 만들어 질 때마다 '선'에 추가됩니다. 선은 패널에 그려집니다.arrayList의 변경 실행 취소

내 패널의 페인트 기능은 다음과 같습니다

public void paintComponent(Graphics g){  

     super.paintComponent(g); 

     for(final Line r:lines){ 

      r.paint((Graphics2D)g); 

     } 
    } 

그리고 매번 두 지점 패널에 클릭 할, 새로운 라인이 만들어집니다.

class Board extends JPanel{ 

public void placeLine(){ 
    Point p1,p2; 
    JLabel l1,l2; 
    ... 
    lines.add(new Line(p1,p2,l1,l2)); 
    this.repaint(); 
} 
public void deleteLine(Line l){ 
    lines.remove(l); 
} 
} 

나는이에있는 UndoableEdit 만들려하고 매번 내가 실행 취소 방법은 마지막 작업 (선을 i.e.creating 또는 라인 삭제)으로 되돌려 야, 취소 제공합니다. JTextArea에서 이벤트에 대해 실행 취소를 시도했지만 ArrayLists에서 이벤트 변경에 대한 사용자 지정 실행 취소를 작성하는 방법을 파악할 수 없습니다. 이것을하기위한 모범을 제안하십시오.

그리고 SSCCE로 게시하지 않아서 정말 유감입니다. 거대한 프로젝트이며 SSCCE를 만드는 것은 거의 불가능합니다.

+0

deleteLine 메서드가 작동합니까? – guness

+0

도움이 될 수 있습니다 : http://stackoverflow.com/questions/3583901/how-to-design-undo-redo-in-text-editor –

답변

0

메멘토 패턴 (http://en.wikipedia.org/wiki/Memento_pattern)에 대해 읽은 다음 웹에서이 패턴을 사용하는 코드 샘플을 검색하는 것이 좋습니다.

+0

넵 .. 감사합니다 !! 그러나 나는 디자인 패턴에 대해 전혀 몰랐습니다 .. 우리가 디자인 패턴을 사용하지 않고 이것을 할 수있는 방법이 있습니까? –

+0

@SivaSubramaniam 디자인 패턴은 알아야 할 기본 사항입니다. 당신이 그들을 사용한 적이 없다면 당신은 그들을 살펴보기 시작해야합니다. (그 중 일부는 사용했는데 디자인 패턴이 있는지 알지 못했습니다.) – dexametason

+0

@SivaSubramaniam 디자인 패턴은 개념, 아이디어입니다. 다운로드 및 실행을위한 실제 패키지가 아닙니다. 일반적인 소프트웨어 개발 문제에 대한 해결책으로서 소프트웨어 개발을위한 모범 사례로 생각하십시오. 패턴에 대해 읽고 유스 케이스에 적용하는 방법에 대해 생각해야합니다. –

0

필자는 일부 스택 구조에서 실행 취소 변경 사항을 만들고 필요에 따라 실행 취소하고 실행하기위한 Runnable 객체를 만들고 저장합니다. 예 :

class Board extends JPanel { 
    ArrayList lines = new ArrayList(); 
    Stack<Runnable> undo = new Stack<Runnable>(); 

    public void placeLine() { 
     Point p1, p2; 
     JLabel l1, l2; 


     final Line line = new Line(p1, p2, l1, l2); 
     lines.add(line); 
     undo.push(new Runnable() { 
      @Override 
      public void run() { 
       lines.remove(line); 
       this.repaint(); 
      } 
     }); 

     this.repaint(); 
    } 

    public void deleteLine(final Line l) { 
     lines.remove(l); 
     undo.push(new Runnable() { 
      @Override 
      public void run() { 
       lines.add(l); 
      } 
     }); 
    } 


    public void undo() { 
     undo.pop().run(); 
    } 
}