观察者模式的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
谢谢!
我不能告诉你什么是错的基础上提供的非编译代码,但我可以说:
- 的CanvasModel是关键的程序数据,这里也许这将是一个
List<Point>
,或者甚至更好,一个List<List<Point>>
。* CanvasModel不应该调用侦听器方法。所有视图共享的数据。 - CanvasModel绝对应该是而不是可以调用任何监听器或视图方法,比如你写它。
- 相反,监听/控制应该是调用CanvasModel方法,可以改变CanvasModel的变量的状态。
- 然后CanvasModel应该打电话通知方法,使任何类听其状态将变更通知。然后
- 的听众可以调用方法来提取从模型(getter方法)的状态。
- 和意见将利用这一信息来改变它们的显示。
Hi @HovercraftFullOfEels,再次感谢所有关于MVC的伟大建议,真的让我更了解它!我试图改进它,使其更“MVC”:)同时,这里是我的这个程序的原始代码,你可以看看,如果你想:) https://www.dropbox.com/sh/crt3kinngy66uvi/AABmAksb8lQBl2oP5qH0P56ga?DL = 0 – hj690 2014-12-03 21:26:02
如需更好的帮助,请考虑创建并发布[最小,完整和可验证示例程序](http://*.com/help/mcve)。我们不想看到你的整个程序,而是你应该将你的代码压缩到仍然编译的最小位,没有额外的代码与你的问题无关,但仍然表明你的问题。模型不应该调用dragMouse或其他侦听器方法。它应该简单地改变它的状态,然后通过调用通知方法通知监听器状态改变,就是这样。 – 2014-12-03 02:07:44
另外,您的视图不应该使用通过调用组件上的'getGraphics()'获得的Graphics对象来绘制,但这是另一个讨论的主题。 – 2014-12-03 02:10:48
@HovercraftFullOfEels感谢您的咨询! – hj690 2014-12-03 02:24:28