【问题标题】:JavaFX: Save and restore visual state of TableView (order, width and visibility)JavaFX:保存和恢复 TableView 的视觉状态(顺序、宽度和可见性)
【发布时间】:2015-01-27 03:19:27
【问题描述】:

在 JavaFX TableView 中,我如何确定的变化

  • 我。列顺序[已解决]
  • 二。列宽 [已解决]
  • 三。列的可见性 [已解决]

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

我。列顺序

现在工作。但是,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)
      }
    }
  }
});

二。列宽

这是有效的。

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);
  });
}

三。列的可见性

这就是诀窍。

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);
  });
}

【问题讨论】:

  • 现在可以处理列宽和列顺序。不过,还不知道列的可见性。
  • 你试过column.visibleProperty()吗?
  • 为什么需要听众?仅在应用程序退出时检查这些值,而不是在值发生变化时更新它们还不够吗?
  • 我同意@James_D - 在我的应用程序中,我只在应用程序启动/停止时检查/保存这些设置。

标签: events javafx listener tableview


【解决方案1】:

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

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

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

也许我稍后会添加可见性保存,如果是,我会在这里告诉你。

【讨论】:

    【解决方案2】:

    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]));
          }
       }
    }
    

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

    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]));
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-06-13
      • 2011-01-03
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 2014-05-14
      相关资源
      最近更新 更多