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 的视觉状态(顺序、宽度和可见性)的主要内容,如果未能解决你的问题,请参考以下文章
向 Tableview Javafx 动态添加和删除 tablecolumn
JavaFx:窗口切换和ListView以及TableView的值绑定