Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
JavaFX。使用TableView绑定不可观测值列表_Javafx_Tableview_Observable - Fatal编程技术网

JavaFX。使用TableView绑定不可观测值列表

JavaFX。使用TableView绑定不可观测值列表,javafx,tableview,observable,Javafx,Tableview,Observable,我编写的应用程序使用Tableview,我希望在其中表示和编辑数据列表 我有一个数据模型。差不多 public class CModel { private List<CItem> m_lstItems; public List<CItem> getList() { return m_lstItems; } } public class CItem { private String m_sName;

我编写的应用程序使用
Tableview
,我希望在其中表示和编辑数据列表

我有一个数据模型。差不多

public class CModel 
{
    private List<CItem> m_lstItems;

    public List<CItem> getList()
    {
        return m_lstItems;
    }

}

public class CItem 
{

    private String m_sName;
    private String m_sType;

    public void setName(String s)
    {
        m_sName = s;
    }

    public String getName()
    {
        return new String(m_sName);
    }

}
公共类CModel
{
私人物品清单;
公共列表getList()
{
返回Mlstu项目;
}
}
公共类城市
{
私有字符串m_sName;
私有字符串m_sType;
公共void集合名(字符串s)
{
m_sName=s;
}
公共字符串getName()
{
返回新字符串(m_sName);
}
}
如果我需要绑定我的数据模型,我可以创建
observableList()
。但这不允许我观察项目编辑。为了使编辑成为可能,我需要从
可观察的
继承
CItem
成员。如果我将其声明为
属性
表视图
将观察项目更改

问题是,如果
CModel
是纯数据模型,我就不应该从
Observable
继承它(因为数据和它的视图应该分开)


如何使用
Observable
包装每个列表项,或者什么是最佳方法?

对于每个列,创建一个
CellValueFactory
,将POJO属性包装在JavaFX属性中。下面的示例在具有名为name的字符串属性的虚拟Person对象上执行此操作:

TableColumn<Person, String> nameColumn = new TableColumn<>("Name");
nameColumn.setCellValueFactory(param -> new SimpleStringProperty(param.getValue().getName()));
TableColumn Name column=新的TableColumn(“名称”);
nameColumn.setCellValueFactory(param->new SimpleStringProperty(param.getValue().getName());

查看为什么使用
字符串(String)
构造函数。是否有一些要求不返回与传递给setter的字符串引用相等的
字符串
?也可能是相关的,而且这不会将表绑定到数据。数据中的更改不会自动反映在表中。若要绑定数据,请执行tableView.setItems(yourListOfItems)。如果您的数据不可见,请执行tableView.getItems().addAll(您的列表项)。PS:这不是你的问题,请接受我对原始问题的回答:)通过“绑定”,我理解表应该更新,例如
tableView.getItems().get(0).setName(…)
,如果不使用可观察属性,则不会发生这种情况。但不是我的问题,所以我也不能接受。啊,那我明白你的意思了。除非域对象实现PropertyChangeSupport,否则您想要做的事情是不可能的。如果实现PropertyChangeSupport,则可以添加更新ObjectProperty的侦听器。这也可以实现自动化。如果您还没有实现PropertyChangeSupport,那么最好将域对象更改为使用JavaFX属性。它们仍然是向后兼容的,因为您仍然会公开普通的getter和setter。顺便说一下,即使在javafx.beans中定义了Observable和friends,这些对象也没有GUI相关的代码,因此您可以在域对象中使用它们。或者,您可以创建一个具有可观察属性的DTO,该DTO复制POJO中的属性,并且知道如何在完成后将它们复制回来。