我正在使用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方法)。
并且视图将使用此信息来更改其显示。