2012-04-09 33 views
2

私は、「線」と呼ばれる線オブジェクトのArrayListを持っています。私はいくつかの制約があるラインを描くために自分のラインクラスを作った。これは、パネル内の2つの点を選択し、2つの点を結ぶ線が引かれます。線が作成されるたびに、線に追加されます。線はパネルで描画されます。arrayList内の変更を元に戻す

私のパネルでペイント機能は、次のようになります。

public void paintComponent(Graphics g){  

     super.paintComponent(g); 

     for(final Line r:lines){ 

      r.paint((Graphics2D)g); 

     } 
    } 

そして、毎回2つの点がパネル上でクリックされ、新しい行が作成されます。

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)について読んでから、このパターンを使用するコードサンプルをWebで検索することをお勧めします。

+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(); 
    } 
} 
関連する問題