gpt4 book ai didi

Java:添加模型集合时如何更新 View ?

转载 作者:行者123 更新时间:2023-11-29 09:25:34 25 4
gpt4 key购买 nike

所以我正在为一位教授重写一个程序,我有一些与模型- View - Controller 模式相关的问题。该程序称为 GraphViewer,用于设计和查看图形(如在图论中,而不是统计中)。到目前为止,我已经这样规划了结构:

  • 模特
    • VertexModel - 具有 ID、位置、颜色和与其重合的边集合
    • EdgeModel - 具有它跨越的两个顶点、重量、颜色和其他一些东西
    • GraphModel - 主要但不只是顶点集合和边集合
  • 观点
    • VertexView - 绘制它的顶点,并有自己的属性
    • EdgeView - 绘制它的边缘,也有它自己的一些属性
    • GraphView - 基本上是一个具有顶点和边 View 集合的 JPanel,当它收到绘制命令时,它还会遍历每个 View 集合并向它们发出绘制命令
  • Controller
    • GraphController - 负责解释用户添加顶点、边等的手势并更新模型。

现在我的第一个问题与这个计划有关:每个模型都应该有一个 View ——即使只有图形模型是一个 JComponent 吗?现在我的一部分说是——因为每个顶点和边的绘制可能不同。但是我的另一部分对 graphview 的那种并行列表结构尖叫不,它具有与 graphview 的 graphmodel 集合中的模型相对应的 View 集合(男孩,这很复杂)。不知何故,如果顶点或边模型发生变化,我必须努力解决整个图形 View 必须重新绘制的问题。我想这个问题的答案也与每个模型是否都有 Controller 有关。 (我是不是处理错了?)

我的第二个问题与第一个问题的答案有些相关:如果将顶点模型添加到图形模型的集合中,我如何知道通知图形 View ?如果设置了一个全新的集合,它将在进入 setEdges() 方法时通知 View 。但是,如果我必须编写 getEdges().add(...) 怎么办?现在需要通知 graphview 更新,但从未调用过 setEdges...

非常感谢,您可以看出我是设计模式的新手!

最佳答案

不要公开模型的私有(private) Collection 成员,因此不允许调用 getEdges().add(...)

相反,公开一个 API 以允许添加/删除边,然后您可以使用观察者模式在模型更改时通知 View 。

简单来说,只处理边...

public class EdgeModel extends AbstractCollection<Edge> implements Observable {
private List<Edge> edges = new ArrayList<Edge>();
@Override public Iterator<Edge> iterator() { return edges.iterator(); }
@Override public int size() { return edges.size(); }
@Override public boolean add(Edge edge) {
if (edges.add(edge)) {
this.notifyObservers();
return true;
}
return false;
}

// other stuff for Observable
}

public class EdgeView implements Observer {
public void setModel(EdgeModel model) {
model.addObserver(this);
}
public void update(Observable o, Object arg) {
// model o has changed... update something visual I guess
}
}

关于Java:添加模型集合时如何更新 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2395704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com