Я пишу простое приложение 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
Спасибо!
Для лучшей помощи подумайте о создании и публикации [Минимальная, полная и проверенная программа примеров] (http://stackoverflow.com/help/mcve). Мы не хотим видеть всю вашу программу, но вы должны сконденсировать свой код на самый маленький бит, который все еще компилируется, не имеет дополнительного кода, который не имеет отношения к вашей проблеме, но все же демонстрирует вашу проблему. И модель не должна вызывать dragMouse или другие методы прослушивания. Он должен просто изменять свое состояние, а затем уведомлять слушателей о том, что состояние изменено путем вызова метода уведомления, вот и все. –
Также ваш взгляд не должен рисовать с помощью объекта Graphics, полученного вызовом 'getGraphics()' на компоненте, но это тема другого обсуждения. –
@HovercraftFullOfEels Спасибо за ваш совет! – hj690