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

Events JavaFX:保存和恢复TableView的可视状态(顺序、宽度和可见性),events,javafx,listener,tableview,Events,Javafx,Listener,Tableview,在JavaFX表视图中,如何确定 I.列顺序[已解决] 二,。列的宽度[已解决] 三、 专栏的可视性[已解决] 要在首选项中保存并还原它们,下次启动应用程序时 I.列顺序 现在工作。但是,重新排列列时会触发wasRemoved(),而不是wasPermutation() final List unchangedColumns=Collections.unmodifiableList(新的数组列表(列)); columns.addListener(新的ListChangeListener(){

在JavaFX表视图中,如何确定

  • I.列顺序[已解决]
  • 二,。列的宽度[已解决]
  • 三、 专栏的可视性[已解决]
要在首选项中保存并还原它们,下次启动应用程序时

I.列顺序

现在工作。但是,重新排列列时会触发
wasRemoved()
,而不是
wasPermutation()

final List unchangedColumns=Collections.unmodifiableList(新的数组列表(列));
columns.addListener(新的ListChangeListener(){
@凌驾
更改后的公共void(ListChangeListener.Change>Change){
while(change.next()){
if(change.wasRemoved()){
ObservableList columns=table.getColumns();
int[]colOrder=newint[columns.size()];
对于(int i=0;i
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);
  });
}
for(表列:列){
column.widthProperty().addListener(新的ChangeListener()){
@凌驾

公共无效已更改(ObservableValueFWIW-以下代码是对问题第一部分的补充,以应用保存的列顺序:

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 applyColumnOrder(int[]顺序){
ObservableList columns=getColumns();
if(order.length==columns.size()){
columns.clear();
对于(int ix=0;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]));
            }
        }
    }
}
private void saveSortOrder(ArrayList sortCols,ArrayList sortDirs){
sortCols=newarraylist();
sortDirs=newarraylist();
对于(表c列:getSortOrder()){
add(c.getText());
添加(c.getSortType().toString());
}
}
私有无效applySortOrder(ArrayList sortCols,ArrayList sortDirs){
List sortOrder=getSortOrder();
sortOrder.clear();
for(int ix=0;ix
我实现了一个简单的自定义TableView,作为TableView的扩展,用于自动存储列顺序和宽度。它基于问题中给定的解决方案。我的自定义TableView称为PropertySaveTableView

你可以在这里找到它:

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


也许我以后会添加可见性保存,如果是的话,我会在这里告诉您。

现在已成功处理列宽和列顺序。不过,还不知道列可见性。您是否尝试过
column.visibleProperty()
?为什么您需要侦听器?在应用程序退出时检查这些侦听器,而不是在值发生变化时更新这些侦听器,这还不够吗?我同意@James_D-在我的应用程序中,我只是在应用程序开始/停止时检查/保存这些设置。
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]));
            }
        }
    }
}