2012-04-09 2 views
2

У меня есть ArrayList объектов линии, называемых «линиями». Я сделал свой собственный класс строк для рисования линий с некоторыми ограничениями. Он включает в себя выбор двух точек в панели и линию, соединяющую две точки. Каждый раз, когда создается строка, она добавляется к «линиям». Линии рисуются в панели.Отменить изменения в массивеList

Функция краски в моей панели выглядит следующим образом:

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

Предлагаю вам прочитать о шаблоне Memento (http://en.wikipedia.org/wiki/Memento_pattern), а затем искать в Интернете некоторые образцы кода, которые используют этот шаблон.

+0

Yup .. Спасибо! Но я понятия не имею о шаблонах проектирования. Есть ли способ сделать это без использования шаблонов дизайна? –

+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(); 
    } 
} 
Смежные вопросы