在TableView中,我有4列:id,name,price,quantity。现在我有3个用户可能想要根据他们的喜好自定义TableView。例如。 user1只想显示3列,最后一列要隐藏,而用户2希望名称列的列宽不同。
如何将TableView的状态(包括其所有列的状态)保存到首选项文件中并在应用程序的开头加载它们,以便为每个用户恢复自定义视图?
答案 0 :(得分:1)
您需要做的第一件事是选择您的存储方法我建议json或xml都有它们的好处并得到广泛的支持。接下来你将弄清楚你将要存储的值
现在,这是一个如何存储这些值的示例
<强> JSON 强>
{
name : {
width:100,
showing:false
},
id : {
width:50,
showing:false
},
etc.
}
<强> XML 强>
<properties>
<name>
<width>100</width>
<showing>false</showing>
</name>
<id>
<width>50</width>
<showing>true</showing>
</id>
etc.
</properties>
接下来如何获取列值,如果你希望它们始终是最新的(不推荐)它会报告每个数字,例如1到50,它将报告1,2,3 ... 50。您必须找到一种方法来过滤掉那些不需要的值。
public void changelistener(final TableColumn listerColumn) {
listerColumn.widthProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
propertyStore.storeWidth(listerColumn.getText(),t1);//when the values are stored
}
});
}
通过changelistener(YourColumn);
更好的选择是在程序关闭时保存值
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
public void handle(WindowEvent we) {
for(int i = 0; i<tv.getColumns().size();i++)
{
TableColumn x = (TableColumn) tv.getColumns().get(i);
propertyStore.storeWidth(x.getText(),x.getWidth());
propertyStore.storeVisible(x.getText(),x.isVisible());
//other option
propertyStore.storeWidth(x.getId(),x.getWidth());
propertyStore.storeVisible(x.getId(),x.isVisible());
}
}
});
如果您使用getId(),则需要为每个列设置ID,如此
TableColumn example = new TableColumn("example");
example.setId("ExampleID");
System.out.println(example.getId());//will print ExampleId
存储您的值
最后,您需要创建一个类来存储并从存储文件中获取值