在自己的构造函数

时间:2018-05-09 12:38:58

标签: java swing model-view-controller constructor

我正在构建一个名为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);
}

我希望可以使用您声明的任何数据源来实例化新的ListView,以便引入列表中的任何数据。到目前为止一切都很好。

现在,我正在构建另一个名为OfferListView的类,它扩展了ListView,为了不拥有一个不需要的额外文件,我希望它实现自己的ListViewDataSource。问题是我不能在这个新类的构造函数中调用super(this, dimension),因为我被告知在调用超类构造函数之前不能使用this

这个“模式”是使用UIKit for iOS进行编程时使用的模式,我认为它非常好,但我不能让它在Java中工作。我怎么能接近这个?

1 个答案:

答案 0 :(得分:0)

Domain-View-Controller策略在90年代用于smaltalk以从域中分离视图,并且它仍然在Web开发中使用。

如果没有为视图等编写所有类,有两种方法可以从域中分离视图。

(1st :)当视图将某些内容传递给域对象时,它会保留polling以检查是否有任何其他更改。这意味着一旦视图对象(文本字段,框架或其他任何东西)将请求转发到域,它会在几秒或几分钟后继续检查是否有更改。然而,这种方法并不好。

(2nd :)观察者设计模式。当一件事发生变化时,它会自动通知所有听众。您的视图必须实现一个接口,域应该提供一种方法来订阅实现该接口的所有对象。这是一个例子,我没有编译它,但它清楚地从view分隔domain

public class View implements PropertyChangeListener {

    private DomainObject object;

    public View(DomainObject object) {
        assert(object != null);
        this.setObject(object);
    }

    public void enterText(String text) {
        this.getObject().update(text);
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
         if(evt.getPropertyName().equals("string_updated"))
             System.out.println("New value is " + evt.getNewValue());
    }

    public DomainObject getObject() {
        return object;
    }

    public void setObject(DomainObject object) {
        this.object = object;
    }

}

这是域类:

public class DomainObject {

    private String text;


    public DomainObject(String test) {
        this.setText(test);
    }


    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }

    public void update(String string) {
        this.setText(string);
        this.getListener().stream().forEach(e -> e.propertyChange(new PropertyChangeEvent(this,"string_updated","",this.getText())));
    }

    private ArrayList<PropertyChangeListener> listener;

    public void subscribe(PropertyChangeListener listener) {
        this.getListener().add(listener);
    }


    public ArrayList<PropertyChangeListener> getListener() {
        return listener;
    }


    public void setListener(ArrayList<PropertyChangeListener> listener) {
        this.listener = listener;
    }


}

正如我所见,你试图获得很多观点,如果它们被包含在彼此中,那么也使用Composite design pattern