在 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 两者都有它们的优点和广泛的支持。接下来你要弄清楚你要存储什么值

  1. 所有列
  2. 所有列宽
  3. 如果列可见

下面是如何存储这些值的示例

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 来存储您的值并从您的存储文件中获取您的值