【发布时间】:2018-10-19 14:07:49
【问题描述】:
我正在构建一个名为 ListView 的 Java Swing 类,它试图成为一个通用列表。
public class ListView<T> extends JPanel {
private IListViewDataSource<T> dataSource;
private JPanel list;
public ListView(IListViewDataSource<T> dataSource, Dimension dimension) {
this.dataSource = dataSource;
list = new JPanel(new GridLayout(0, 1));
this.add(new JScrollPane(list));
this.setPreferredSize(dimension);
}
public void loadRows() {
for (int i = 0; i < dataSource.getNumberOfElements(); i++) {
JLabel label = new JLabel(dataSource.getTitleOfElement(dataSource.getElementAtPosition(i)));
list.add(label);
}
}
}
为了做到这一点,我声明了一个名为 IListViewDataSource 的接口,它定义了列表视图获取其数据所需的方法。
public interface IListViewDataSource<T> {
T getElementAtPosition(int position);
int getNumberOfElements();
String getTitleOfElement(T element);
}
我希望可以使用您声明的任何 DataSource 实例化一个新的 ListView,以便在列表中引入任何数据。到目前为止一切顺利。
现在,我正在构建另一个名为 OfferListView 的类,它扩展了 ListView,为了不产生不必要的额外文件,我希望它实现自己的 ListViewDataSource。问题是我不能在这个新类的构造函数中调用super(this, dimension),因为我被告知在调用超类构造函数之前不能使用this。
这个“模式”是使用 iOS 的 UIKit 编程时使用的,我认为它非常好,但我无法让它在 Java 中工作。我该如何处理?
【问题讨论】:
-
首先这不是模型视图控制器。其次,如果你想让你的领域层独立于视图,那么你可以使用观察者设计模式来做到这一点。
-
**EXTRA: ** 在这种编程中你不需要控制器,你可以直接引用域对象但让域对象触发事件。例如,查看
PropertyChangeListener的工作原理。在域中提供一个简单的订阅函数,注册所有实现PropertyChangeListener的元素 -
@LuaiGhunim 老实说,我对 java 设计模式缺乏经验,所以我不太明白你的建议。可以举个例子吗?
-
从域中分离视图的例子?
标签: java swing model-view-controller constructor