观察者模式的Java MVC不同步的不同意见

问题描述:

我正在写一个简单的使用观察者模式的Java帆布应用程序,所以我可以创建多个同步窗口(视图)。但是当我调试时,我遇到了多个视图同步的问题,但在实际运行时却没有同步。观察者模式的Java MVC不同步的不同意见

任何人都可以帮我出吗?

这里是我是如何实现这一点(我把@Hovercraft充满了鳗鱼的意见,并努力创建和发布一个最小的,完整的和可验证的示例程序。):

监听器,这是一个接口:

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

视图实现监听器,并且我overrided 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://*.com/help/mcve)。我们不想看到你的整个程序,而是你应该将你的代码压缩到仍然编译的最小位,没有额外的代码与你的问题无关,但仍然表明你的问题。模型不应该调用dragMouse或其他侦听器方法。它应该简单地改变它的状态,然后通过调用通知方法通知监听器状态改变,就是这样。 – 2014-12-03 02:07:44

+0

另外,您的视图不应该使用通过调用组件上的'getGraphics()'获得的Graphics对象来绘制,但这是另一个讨论的主题。 – 2014-12-03 02:10:48

+0

@HovercraftFullOfEels感谢您的咨询! – hj690 2014-12-03 02:24:28

我不能告诉你什么是错的基础上提供的非编译代码,但我可以说:

  • 的CanvasModel是关键的程序数据,这里也许这将是一个List<Point>,或者甚至更好,一个List<List<Point>>。* CanvasModel不应该调用侦听器方法。所有视图共享的数据。
  • CanvasModel绝对应该是而不是可以调用任何监听器或视图方法,比如你写它。
  • 相反,监听/控制应该是调用CanvasModel方法,可以改变CanvasModel的变量的状态。
  • 然后CanvasModel应该打电话通知方法,使任何类听其状态将变更通知。然后
  • 的听众可以调用方法来提取从模型(getter方法)的状态。
  • 和意见将利用这一信息来改变它们的显示。
+0

Hi @HovercraftFullOfEels,再次感谢所有关于MVC的伟大建议,真的让我更了解它!我试图改进它,使其更“MVC”:)同时,这里是我的这个程序的原始代码,你可以看看,如果你想:) https://www.dropbox.com/sh/crt3kinngy66uvi/AABmAksb8lQBl2oP5qH0P56ga?DL = 0 – hj690 2014-12-03 21:26:02