Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何绑定列表(一次或多次)?_Java_Swing_Data Binding - Fatal编程技术网

Java 如何绑定列表(一次或多次)?

Java 如何绑定列表(一次或多次)?,java,swing,data-binding,Java,Swing,Data Binding,我按照演示模型模式对一些屏幕进行编码 我将一些bean存储在ArrayList 我将在JTable中显示此列表的内容,这要归功于AbstractTableModel 我还想在组合框中(以一种形式)显示此列表中的一些记录,同时在JList中显示其他一些记录 这三个屏幕(及其型号)彼此独立 如何管理在我的列表中添加{一个或多个}/删除{一个或多个},并在任何地方“实时”查看更改 我将要编写自己的ObservableList或围绕EventDispatcher实现它。。。你觉得怎么样 附言:

我按照演示模型模式对一些屏幕进行编码

  • 我将一些bean存储在
    ArrayList
  • 我将在
    JTable
    中显示此列表的内容,这要归功于
    AbstractTableModel
  • 我还想在组合框中(以一种形式)显示此列表中的一些记录,同时在JList中显示其他一些记录
  • 这三个屏幕(及其型号)彼此独立
如何管理在我的列表中添加{一个或多个}/删除{一个或多个},并在任何地方“实时”查看更改

我将要编写自己的ObservableList或围绕EventDispatcher实现它。。。你觉得怎么样


附言:

  • 我知道在C#中,
    BindingList
    有助于实现这一目的,Java呢
  • 由于
    PropertyChangeSupport
    ,我已经能够显示每个bean的更新
对于jcombox和JList,您可以使用subList()方法简单地引用ArrayList的部分。如果您可以轻松识别ArrayList中的开始和结束位置,并且所需的元素是连续的,那么这将起作用


如果情况更为动态,您可以实现自定义列表类,这些类在构造函数中使用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“因此,我关心的是将每个屏幕和它们自己的模型分开”它们显示相同的数据(并允许“实时”更改)或不显示:-)共享模型是可以的,事实上,这就是模式的全部要点