0

Я пишу простое приложение Canvas Canvas с использованием шаблона Observer, поэтому я могу создать несколько синхронных окон (представлений). Но я столкнулся с проблемой синхронизации нескольких представлений при отладке, но не синхронизации при фактическом запуске.Java MVC с шаблоном Observer не синхронизируется для разных представлений

Любой может мне помочь?

Вот как я реализовал это (я взял @Hovercraft Насытившись советом Eels и пробовать создание и размещение Minimal, полную и проверяемый Пример программы.):

Слушатель, который представляет собой интерфейс:

public interface CanvasListener { 
    void dragMouse(MouseEvent e); 
} 

У меня есть модель, которая использовала для уведомления всех слушателей;

public class CanvasModel{ 
    private List<CanvasListener> listeners; 
    //...other functions 
    public void mouseDragged(MouseEvent e) { 
    for(CanvasListener listener: listeners){ 
     listener.dragMouse(e); 
    } 
    } 
} 

Вид реализует Слушатель, и я перекрытая функцию dragMouse и реализует полотно:

public class CanvasView implements CanvasListener { 
    private CanvasModel model; 
    private JPanel panel; 

    public CanvasView(CanvasModel myModel) { 
    // some initializations 
    panel.addMouseMotionListener(new MouseMotionAdapter() { 
     public void mouseDragged(MouseEvent e) { 
     model.mouseDragged(e); 
     } 
    }); 
    } 

    @Override 
    public void dragMouse(MouseEvent e) { 
    Graphics g = panel.getGraphics(); 
    g.drawLine(a, b, c, d); //parameters here are not real 
    g.dispose(); 
    } 
} 

И в главном классе, я создал 2 Просмотров.

public static void main(String[] args){ 
    CanvasModel model = new CanvasModel(); 
    new CanvasView(model); 
    new CanvasView(model); 
} 

Но если я рисую на одном окнах, только один показывает графику, как показано на picture

Но если проследить в коды, оба окна отражают графики, как показано на picture

Спасибо!

+1

Для лучшей помощи подумайте о создании и публикации [Минимальная, полная и проверенная программа примеров] (http://stackoverflow.com/help/mcve). Мы не хотим видеть всю вашу программу, но вы должны сконденсировать свой код на самый маленький бит, который все еще компилируется, не имеет дополнительного кода, который не имеет отношения к вашей проблеме, но все же демонстрирует вашу проблему. И модель не должна вызывать dragMouse или другие методы прослушивания. Он должен просто изменять свое состояние, а затем уведомлять слушателей о том, что состояние изменено путем вызова метода уведомления, вот и все. –

+0

Также ваш взгляд не должен рисовать с помощью объекта Graphics, полученного вызовом 'getGraphics()' на компоненте, но это тема другого обсуждения. –

+0

@HovercraftFullOfEels Спасибо за ваш совет! – hj690

ответ

1

Я не могу сказать вам, что неправильно на основе не-компилируемый код, доступный, но я могу сказать:

  • CanvasModel держит ключевые данные программы, то здесь, возможно, было бы List<Point> или, возможно, даже лучше, List<List<Point>>. * CanvasModel не должен вызывать метод прослушивателя. Данные, разделяемые всеми представлениями.
  • CanvasModel должен быть определенно не, вызывающий любые методы прослушивания или просмотра, например, вы его написали.
  • Вместо этого слушатели/Control должны вызывать методы CanvasModel, которые могут изменять состояние переменных CanvasModel.
  • Затем CanvasModel должен вызывать методы уведомления, чтобы любой класс, слушающий его состояние, уведомлялся об изменениях.
  • Затем слушатели могут вызывать методы для извлечения состояния из модели (методы получения).
  • И представления будут использовать эту информацию для изменения своих дисплеев.
+0

Hi @HovercraftFullOfEels, Еще раз спасибо за все те великие советы о MVC, действительно заставляет меня лучше понимать об этом! Я пытаюсь улучшить его и сделать его более «MVC» :) Между тем, вот мои оригинальные коды этой программы, вы можете посмотреть, если хотите: https://www.dropbox.com/sh/crt3kinngy66uvi/AABmAksb8lQBl2oP5qH0P56ga? дл = 0 – hj690

Смежные вопросы