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

Posted

技术标签:

【中文标题】JavaFX:保存和恢复 TableView 的视觉状态(顺序、宽度和可见性)【英文标题】:JavaFX: Save and restore visual state of TableView (order, width and visibility) 【发布时间】: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 - 在我的应用程序中,我只在应用程序启动/停止时检查/保存这些设置。 【参考方案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]));
            
        
    

【讨论】:

以上是关于JavaFX:保存和恢复 TableView 的视觉状态(顺序、宽度和可见性)的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX - 保存/加载 - 形状/布局

向 Tableview Javafx 动态添加和删除 tablecolumn

JavaFx:窗口切换和ListView以及TableView的值绑定

如何在 JavaFx TableView 中添加 TableView 页脚

JavaFX布尔绑定和TableView绑定多个

JavaFX TableView 动态列和数据值