在JavaFX中保存和恢复TableView(隐藏哪些列,列宽)的状态

时间:2018-01-03 23:38:57

标签: javafx tableview customization

简介

在TableView中,我有4列:id,name,price,quantity。现在我有3个用户可能想要根据他们的喜好自定义TableView。例如。 user1只想显示3列,最后一列要隐藏,而用户2希望名称列的列宽不同。

问题

如何将TableView的状态(包括其所有列的状态)保存到首选项文件中并在应用程序的开头加载它们,以便为每个用户恢复自定义视图?

1 个答案:

答案 0 :(得分:1)

您需要做的第一件事是选择您的存储方法我建议json或xml都有它们的好处并得到广泛的支持。接下来你将弄清楚你将要存储的值

  1. 所有列
  2. 所有列宽
  3. 如果列可见
  4. 现在,这是一个如何存储这些值的示例

    <强> 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
    

    存储您的值

    最后,您需要创建一个类来存储并从存储文件中获取值