我正在使用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中所示

谢谢!

最佳答案

根据现有的不可编译代码,我无法告诉您出了什么问题,但是我可以说:


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

10-07 18:14