【问题标题】:Save and Restore state of a TableView (which columns are hidden, width of columns) in JavaFX在 JavaFX 中保存和恢复 TableView 的状态(隐藏哪些列,列的宽度)
【发布时间】:2018-06-13 16:15:01
【问题描述】:

简介

在 TableView 中,我有 4 列:id、名称、价格、数量。现在我有 3 个用户可能想要根据自己的喜好自定义 TableView。例如。用户 1 只希望显示 3 列,隐藏最后一列,而用户 2 想要名称列的列宽不同。

问题

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

【问题讨论】:

  • 没有内置机制可以做到这一点。您只需在应用程序关闭时将信息以您选择的格式保存到文件中,并在应用程序启动时重新加载。
  • 感谢您的意见,詹姆斯!但我不知道从哪里开始(需要什么信息来恢复列的宽度和可见性属性)你能给我提供一个快速开始的代码吗?这样我至少可以对需要做什么有一个方向。
  • 你坚持哪一部分?就目前而言,这个问题太宽泛了。
  • “恢复列的宽度和可见性属性需要哪些信息” 应用程序关闭时列的宽度和可见性?
  • 是的,你是对的!我的问题不够清楚。奥斯汀刚刚给了我一个非常有用的见解。我想我可以使用他提供的信息。再次感谢您的帮助。

标签: javafx tableview customization


【解决方案1】:

您需要做的第一件事是选择您的存储方法,我建议使用 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

保存你的价值观

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

【讨论】:

  • stage.setOnCloseRequest 没有定义在应用程序关闭时调用的处理程序。当有 external 请求关闭 stage 时调用处理程序。因此,如果您有多个窗口,这可能会被过于频繁地调用,并且如果您使用代码关闭最后一个打开的窗口(例如在事件处理程序中),它根本不会被调用。覆盖 Application.stop() 以在应用程序退出时执行代码。
  • 是的!这太棒了,奥斯汀!我当然可以使用您提供的信息。所以我想为每个用户创建一个新的 TableProperties.class 来存储/恢复每个 TableColumn 的可见性和宽度。但是识别/解决某个 TableColumn 的唯一方法是通过它的标题文本?
  • @James_D 感谢您的澄清。我想我会选择 Austin 提出的 stage.setOnCloseRequest(),因为它完全可以满足我的环境。但我确实看到某些情况下应该在 Application.stop() 中进行存储。
  • @Chiggiddi 如果只有一个窗口,至少使用setOnHidden(...),保证在窗口关闭时调用。
  • stage.close()stage.hide()synonymous。外部请求本质上是由操作系统发出的:因为标准窗口按钮是由本机窗口工具包创建的,其中包括标准窗口关闭按钮。所以setOnCloseRequest 处理程序只能从“本机”调用中调用,例如标准的窗口关闭按钮和 Mac 上的 CMD-Q 之类的东西。
猜你喜欢
  • 2015-01-27
  • 2017-11-01
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 2014-05-14
相关资源
最近更新 更多