2

「ライン」と呼ばれるライン オブジェクトの ArrayList があります。いくつかの制約のある線を描画するために、独自の線クラスを作成しました。パネル内の 2 点を選択すると、2 点を結ぶ線が描かれます。行が作成されるたびに、「行」に追加されます。線はパネルに描かれています。

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

   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 を作成したいのですが、元に戻すたびに、元に戻すメソッドは最後のアクション (行の作成または行の削除) に戻る必要があります。JTextArea のイベントの取り消しを試みましたが、ArrayLists のイベント変更のカスタム取り消しを作成する方法がわかりませんでした。これを行うための例を提案します。

そして、SSCCE として投稿できなくて本当に申し訳ありません。これは巨大なプロジェクトであり、SSCCE を作成することはほとんど不可能です。

4

2 に答える 2

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();
    }
}
于 2012-04-09T09:15:25.777 に答える
0

Memento パターン ( http://en.wikipedia.org/wiki/Memento_pattern ) について読んだ後、このパターンを使用するコード サンプルを Web で検索することをお勧めします。

于 2012-04-09T08:21:57.927 に答える