JavaFX:保存并恢复TableView的可视状态(顺序,宽度和可见性)

时间:2014-11-28 12:52:06

标签: events javafx listener tableview

在JavaFX TableView中,如何确定

的更改
  • 予。列顺序[已解决]
  • II。列的宽度[已解决]
  • III。该栏的可见性[已解决]

将它们保存在首选项中并在下次启动应用程序时将其还原?

予。列顺序

立即行动。但是,重新排序列时会触发wasRemoved(),而不是wasPermutation()

final List<TableColumn<MyType, ?>> unchangedColumns = Collections.unmodifiableList(new ArrayList<TableColumn<MyType, ?>>(columns));

columns.addListener(new ListChangeListener<TableColumn<MyType, ?>>() {
  @Override
  public void onChanged(ListChangeListener.Change<? extends TableColumn<MyType, ?>> change) {
    while (change.next()) {
      if (change.wasRemoved()) {
        ObservableList<TableColumn<MyType, ?>> columns = table.getColumns();
        int[] colOrder = new int[columns.size()];

        for (int i = 0; i < columns.size(); ++i) {
          colOrder[i] = unchangedColumns.indexOf(columns.get(i));
        }

        // colOrder will now contain current order (e.g. 1, 2, 0, 5, 4)
      }
    }
  }
});

II。列的宽度

这很有效。

for (TableColumn<MyType, ?> column: columns) {
  column.widthProperty().addListener(new ChangeListener<Number>() {
    @Override
      public void changed(ObservableValue<? extends Number> observableValue, Number oldWidth, Number newWidth) {
        logger.info("Width: " + oldWidth + " -> " + newWidth);
  });
}

III。专栏的可见性

这就是诀窍。

for (TableColumn<MyType, ?> column: columns) {
  column.visibleProperty().addListener(new ChangeListener<Boolean>() {
    @Override
      public void changed(ObservableValue<? extends Boolean> observableValue, Boolean oldVisibility, Boolean newVisibility) {
        logger.info("Visibility: " + oldVisibility + " -> " + newVisibility);
  });
}

2 个答案:

答案 0 :(得分:1)

我已经实现了一个简单的自定义TableView作为TableView的扩展,用于自动存储列顺序和宽度。它基于问题中的给定解决方案。我的自定义TableView称为PropertySaveTableView。

你可以在这里找到它: https://gist.github.com/y4nnick/ca976e58be23aab20dfbc8d81ea46816

&#34; EinstellungService.java&#34;只是一个永久存储属性的接口。您必须使用自己喜欢的技术创建自己的实现。

也许我会稍后添加可见性,如果是这样,我会在这里通知你。

答案 1 :(得分:0)

FWIW - 以下代码是问题第一部分的补充,用于应用保存的列顺序:

[
 {
  "title": "temporary title",
  "key": "652843722",
  "path": "/states/CA",
  "filename": "climate-pollution-harmful.html",
  "link": "http://a-url-goes-here.com",
  "blank": "yes",
  "author": "",
  "date": "August 15, 2015"
 }
]

最重要的是,这里有一些持久化表排序顺序的方法:

private void applyColumnOrder(int[] order) {    
   ObservableList<TableColumn<MyType, ?>> columns = getColumns();

   if (order.length == columns.size()) {
      columns.clear();

      for (int ix = 0; ix < order.length; ix++) {
          columns.add(unchangedColumns.get(order[ix]));
      }
   }
}