带有Observer-pattern的Java MVC不同步不同的视图

时间:2014-12-03 02:02:39

标签: java swing model-view-controller observer-pattern synchronize

我正在使用Observer-pattern编写一个简单的Java Canvas应用程序,因此我可以创建多个同步窗口(视图)。但是我遇到了一个问题,即在调试时多个视图同步,但在实际运行时不同步。

任何人都可以帮助我解决这个问题吗?

以下是我如何实现这一点(我采用了@Hovercraft Full Of Eels的建议,并试图创建并发布一个最小,完整和可验证的示例程序。):

监听器,这是一个接口:

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);
    }
  }
}

一个视图实现了Listener,我重写了dragMouse函数并实现了canvas:

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 个答案:

答案 0 :(得分:1)

根据可用的不可编辑代码,我无法告诉您错误,但我可以说:

  • CanvasModel保存关键程序数据,这里可能是List<Point>或者甚至更好,List<List<Point>>。* CanvasModel不应该调用侦听器方法。所有视图共享的数据。
  • CanvasModel绝对应该调用任何侦听器或视图方法,例如你已经编写过。
  • 相反,listeners / Control应该调用可以改变CanvasModel变量状态的CanvasModel方法。
  • 然后CanvasModel应调用通知方法,以便任何听取其状态的类都会收到更改通知。
  • 然后,侦听器可以调用方法从模型中提取状态(getter方法)。
  • 视图将使用此信息更改其显示。