如何绑定List(一次或多次)?
我按照Presentation Model模式编写了一些屏幕。
- 我将一些Beans存储在
ArrayList
- 由于
AbstractTableModel
,我将在JTable
显示此List的内容 - 我还希望在combobox(表单中) 和其他一些 JList 中同时显示此列表中的一些记录
- 这三个屏幕(及其模型)彼此独立
如何管理我的列表中添加{一个或多个} /删除{一个或多个}并查看“实时”中的更改?
我即将编写自己的ObservableList或围绕EventDispatcher实现…你怎么看?
PS:
- 我知道在C#中
BindingList
有助于实现这一目的,Java呢? - 由于
PropertyChangeSupport
,我已经能够显示每个bean的更新。
让您的AbstractTableModel
实现ListModel
,它可以与JComboBox and
JList一起使用。 您可以根据需要将方法转发到默认模型实现。
附录: 如何使用表中提到的SharedModelDemo
是一个可以帮助您入门的示例。 它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); } }); } }
对于JComboBox和JList,您可以使用subList()方法简单地引用ArrayList的各个部分。 如果您可以轻松识别ArrayList中的起始位置和结束位置,并且所需的元素是顺序的,则此方法可行。
如果情况比动态更动态,您可以实现在构造函数中获取ArrayList的自定义List类,然后应用返回相应记录所需的任何逻辑。