如何绑定列表(一次或多次)? [英] How to bind a List (one or more times)?

查看:136
本文介绍了如何绑定列表(一次或多次)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述




  • 我将一些Bean存储在一个 ArrayList

  • 我将在 JTable 中显示此列表的内容,感谢 AbstractTableModel

  • 我还想在组合框(表单)中显示某些记录和某些其他在JList中,同时

  • 这三个屏幕(及其模型)彼此独立



如何管理我的列表中添加{一个或多个} /删除{一个或多个},并查看真实的时间无处不在



我要写我自己的ObservableList或在EventDispatcher周围实现...你觉得如何?






PS:




  • 我知道在C# code> BindingList 有助于此目的,Java如何?

  • 我是由于 PropertyChangeSupport 可以显示每个bean的更新。


解决方案

让你的 AbstractTableModel ListModel ,它可以同时使用 JComboBox和 JList。您可以根据需要将方法转发到默认模型实现。



附录: SharedModelDemo ,在 如何使用表格 ,是一个可能让您开始的例子。 扩展DefaultListModel实现TableModel ,而您应该执行 extends AbstractTableModel实现ListModel



附录:作为参考,以下是最小化实现和三个测试实例的概述。我使用了默认的组合和列表实现,但是如果需要,您可以使用相应的抽象实现。

  public class SharedModel extends AbstractTableModel 
实现ComboBoxModel,ListModel {
private ComboBoxModel comboModel = new DefaultComboBoxModel();
private ListModel listModel = new DefaultListModel();

// ComboBoxModel
@Override
public void setSelectedItem(Object anItem){
comboModel.setSelectedItem(anItem);
}

@Override
public Object getSelectedItem(){
return comboModel.getSelectedItem();
}

// ListModel
@Override
public int getSize(){
return listModel.getSize();
}

@Override
public Object getElementAt(int index){
return listModel.getElementAt(index);
}

@Override
public void addListDataListener(ListDataListener l){
listModel.addListDataListener(l);
}

@Override
public void removeListDataListener(ListDataListener l){
listModel.removeListDataListener(l);
}

// TableModel
@Override
public int getRowCount(){
return 0;
}

@Override
public int getColumnCount(){
return 0;
}

@Override
public Object getValueAt(int rowIndex,int columnIndex){
return null;
}

public static void main(String [] args){
EventQueue.invokeLater(new Runnable(){

@Override
public void run(){
SharedModel sm = new SharedModel();
JTable table = new JTable(sm);
JList list = new JList(sm);
JComboBox check = new JComboBox(sm);
}
});
}
}


I follow the Presentation Model pattern for coding some screens.

  • I store some Beans in an ArrayList
  • I will display the content of this List in a JTable, thanks to an AbstractTableModel
  • I also want to display some records from this list in a Combo Box (in a form) and some others in a JList, at the same time
  • These three screens (and their model) are independent from each other

How to manage add {one or more}/remove {one or more} on my List and view changes in "real-time" everywhere?

I'm about to write my own ObservableList or implement that around an EventDispatcher... What do you think?


PS:

  • I know that in C# the BindingList helps for that purpose, what about Java?
  • I'm already able to display updates of each bean, thanks to PropertyChangeSupport.

解决方案

Let your AbstractTableModel implement ListModel, which is usable with both JComboBox andJList. You can forward methods to the default model implementations as required.

Addendum: SharedModelDemo, mentioned in How to Use Tables, is an example that may get you started. It extends DefaultListModel implements TableModel, while you should do extends AbstractTableModel implements ListModel

Addendum: For reference, here's an outline of the minimal implementation and three test instantiations. I've used the default combo and list implementations, but you can use the corresponding abstract implementations if necessary.

public class SharedModel extends AbstractTableModel
        implements ComboBoxModel, ListModel {
    private ComboBoxModel comboModel = new DefaultComboBoxModel();
    private ListModel listModel = new DefaultListModel();

    //ComboBoxModel
    @Override
    public void setSelectedItem(Object anItem) {
        comboModel.setSelectedItem(anItem);
    }

    @Override
    public Object getSelectedItem() {
        return comboModel.getSelectedItem();
    }

    // ListModel
    @Override
    public int getSize() {
        return listModel.getSize();
    }

    @Override
    public Object getElementAt(int index) {
        return listModel.getElementAt(index);
    }

    @Override
    public void addListDataListener(ListDataListener l) {
        listModel.addListDataListener(l);
    }

    @Override
    public void removeListDataListener(ListDataListener l) {
        listModel.removeListDataListener(l);
    }

    // TableModel
    @Override
    public int getRowCount() {
        return 0;
    }

    @Override
    public int getColumnCount() {
        return 0;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return null;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                SharedModel sm = new SharedModel();
                JTable table = new JTable(sm);
                JList list = new JList(sm);
                JComboBox check = new JComboBox(sm);
            }
        });
    }
}

这篇关于如何绑定列表(一次或多次)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆