在 JavaFX 中保存和恢复 TableView 的状态(哪些列被隐藏,列的宽度)
Save and Restore state of a TableView (which columns are hidden, width of columns) in JavaFX
简介
在 TableView 中,我有 4 列:id、name、price、quantity。现在我有 3 个用户可能想要根据自己的喜好自定义 TableView。例如。用户 1 只希望显示 3 列,最后一列隐藏起来,而用户 2 希望名称列具有不同的列宽。
问题
如何将 TableView 的状态(包括其所有列的状态)保存到首选项文件中并在应用程序启动时加载它们,以便为每个用户恢复自定义视图?
您需要做的第一件事是选择您的存储方法我推荐 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
存储您的值
最后您需要创建一个 class 来存储您的值并从您的存储文件中获取您的值
简介
在 TableView 中,我有 4 列:id、name、price、quantity。现在我有 3 个用户可能想要根据自己的喜好自定义 TableView。例如。用户 1 只希望显示 3 列,最后一列隐藏起来,而用户 2 希望名称列具有不同的列宽。
问题
如何将 TableView 的状态(包括其所有列的状态)保存到首选项文件中并在应用程序启动时加载它们,以便为每个用户恢复自定义视图?
您需要做的第一件事是选择您的存储方法我推荐 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
存储您的值
最后您需要创建一个 class 来存储您的值并从您的存储文件中获取您的值