Java 如何绑定列表(一次或多次)?
我按照演示模型模式对一些屏幕进行编码Java 如何绑定列表(一次或多次)?,java,swing,data-binding,Java,Swing,Data Binding,我按照演示模型模式对一些屏幕进行编码 我将一些bean存储在ArrayList 我将在JTable中显示此列表的内容,这要归功于AbstractTableModel 我还想在组合框中(以一种形式)显示此列表中的一些记录,同时在JList中显示其他一些记录 这三个屏幕(及其型号)彼此独立 如何管理在我的列表中添加{一个或多个}/删除{一个或多个},并在任何地方“实时”查看更改 我将要编写自己的ObservableList或围绕EventDispatcher实现它。。。你觉得怎么样 附言:
- 我将一些bean存储在
ArrayList
- 我将在
中显示此列表的内容,这要归功于JTable
AbstractTableModel
- 我还想在组合框中(以一种形式)显示此列表中的一些记录,同时在JList中显示其他一些记录
- 这三个屏幕(及其型号)彼此独立
附言:
- 我知道在C#中,
有助于实现这一目的,Java呢BindingList
- 由于
,我已经能够显示每个bean的更新李>PropertyChangeSupport
如果情况更为动态,您可以实现自定义列表类,这些类在构造函数中使用ArrayList,然后应用所需的任何逻辑来返回适当的记录。让您的
AbstractTableModel
实现,它可用于JComboBox和JList。您可以根据需要将方法转发到默认模型实现
附录:,在中提到,是一个可以让您开始学习的示例。它扩展了DefaultListModel实现了TableModel
,而您应该执行扩展了AbstractTableModel实现了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);
}
});
}
}
你应该看看JGoodies绑定,它基于PresentationModel模式,应该适合你的问题。实际上,情况更动态:我希望看到我的JList和组合框的内容“实时”更改,甚至更重要的是:每个条目的内容必须动态更新。subList()是个好主意,但是如果我删除一个条目会发生什么呢?我的原始列表将被更改,但JTable不会被通知,也不会引发fireTableRowsDeleted
。我喜欢你的答案!你的建议是实施一种“瑞士刀”模式,就是这样吗?但是,我是否必须将这个共享模型注入代表每个屏幕的每个子模型?如果是,我必须找到另一个解决方案,因为每个屏幕都是在一个单独的模块中开发的。如果我在较低级别(在一个单独的模块中,不依赖javax.swing)实现“ListModel-like”(ObservableList
),并与所有屏幕共享它,您会怎么想?像这样,每个子模型都将能够接收添加/删除/更新通知?我不确定我是否理解。共享模型可以有任意数量的侦听视图AbstractListModel
可以为JList
或JComboBox
提供事件处理,就像AbstractTableModel
为JTable
提供的一样。您的数据模型是分层的?如果我不够清楚,我很抱歉。因此,我关心的是将每个屏幕和它们自己的模型分开。在我看来,如果我有一个带有JTable
的屏幕,我必须扩展一个AbstractTableModel
来“馈送”JTable。如果我有另一个带有JList(显示相同数据)的屏幕,我会扩展一个专用的AbstractListModel
。在较低的级别上,AbstractTableModel
和AbstractListModel
都将侦听同一个“可观察列表”(与swing完全不耦合)上的事件。。。。也许我错了,请告诉我不,我的数据模型不是分层的。对,模型是分开的。我在上面概述了这样一个SharedModel
。它的一个实例可以传递给所有三个视图的构造函数:table、combo和list。当然,您必须“填写”数据。@Destroyica“因此,我关心的是将每个屏幕和它们自己的模型分开”它们显示相同的数据(并允许“实时”更改)或不显示:-)共享模型是可以的,事实上,这就是模式的全部要点