如何绑定List(一次或多次)?

时间:2011-09-27 16:11:30

标签: java swing data-binding

我按照Presentation Model模式编写了一些屏幕。

  • 我将一些Beans存储在ArrayList
  • 由于JTable
  • ,我会在AbstractTableModel中显示此列表的内容
  • 我还想在此列表中的中显示以及其他一些 中的同时中的一些记录
  • 这三个屏幕(及其型号)彼此独立

如何在我的列表中管理添加{一个或多个} /删除{一个或多个}并在所有地方“实时”查看更改?

我即将编写自己的ObservableList或围绕EventDispatcher实现...你怎么看?


PS:

  • 我知道在C#中BindingList有助于达到这个目的,Java呢?
  • 由于PropertyChangeSupport,我已经能够显示每个bean的更新。

2 个答案:

答案 0 :(得分:4)

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

附录:SharedModelDemo中提到的How to Use Tables是一个可以帮助您入门的示例。它是extends DefaultListModel implements TableModel,而您应该extends AbstractTableModel implements ListModel

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

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);
            }
        });
    }
}

答案 1 :(得分:2)

对于JComboBox和JList,您可以使用subList()方法简单地引用ArrayList的各个部分。如果您可以轻松识别ArrayList中的起始位置和结束位置,并且所需的元素是连续的,那么这将起作用。

如果情况比动态更动态,您可以实现在构造函数中获取ArrayList的自定义List类,然后应用返回相应记录所需的任何逻辑。