如何绑定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类,然后应用返回相应记录所需的任何逻辑。