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

use*_*038 9 events javafx listener tableview

在JavaFX TableView中,如何确定更改

  • 一,列顺序[已解决]
  • II.列的宽度[已解决]
  • III.专栏的可见性[已解决]

将它们保存在首选项中并恢复它们,下次启动应用程序时?

I.列顺序

现在工作.但是,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)
      }
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

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);
  });
}
Run Code Online (Sandbox Code Playgroud)

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);
  });
}
Run Code Online (Sandbox Code Playgroud)

mcw*_*933 0

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

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]));
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

最重要的是,以下是一些保留表排序顺序的方法:

private void saveSortOrder(ArrayList<String> sortCols, ArrayList<String> sortDirs) {
    sortCols = new ArrayList<>();
    sortDirs = new ArrayList<>();

    for (TableColumn<MyType, ?> c : getSortOrder()) {
        sortCols.add(c.getText());
        sortDirs.add(c.getSortType().toString());
    }
}

private void applySortOrder(ArrayList<String> sortCols, ArrayList<String> sortDirs) {
    List<TableColumn<MyType, ?>> sortOrder = getSortOrder();
    sortOrder.clear();

    for (int ix = 0; ix < sortCols.length; ix++) {
        for (TableColumn<MyType, ?> c : unchangedColumns) {
            if (c.getText().equals(sortCols[ix])) {
                sortOrder.add(c);
                c.setSortType(TableColumn.SortType.valueOf(sortDirs[ix]));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)