我正在使用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
所示谢谢!
答案 0 :(得分:1)
根据可用的不可编辑代码,我无法告诉您错误,但我可以说:
List<Point>
或者甚至更好,List<List<Point>>
。* CanvasModel不应该调用侦听器方法。所有视图共享的数据。