在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)
}
}
}
});
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);
});
}
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);
});
}
答案 0 :(得分:1)
我已经实现了一个简单的自定义TableView作为TableView的扩展,用于自动存储列顺序和宽度。它基于问题中的给定解决方案。我的自定义TableView称为PropertySaveTableView。
你可以在这里找到它: https://gist.github.com/y4nnick/ca976e58be23aab20dfbc8d81ea46816
&#34; EinstellungService.java&#34;只是一个永久存储属性的接口。您必须使用自己喜欢的技术创建自己的实现。
也许我会稍后添加可见性,如果是这样,我会在这里通知你。
答案 1 :(得分:0)
FWIW - 以下代码是问题第一部分的补充,用于应用保存的列顺序:
[
{
"title": "temporary title",
"key": "652843722",
"path": "/states/CA",
"filename": "climate-pollution-harmful.html",
"link": "http://a-url-goes-here.com",
"blank": "yes",
"author": "",
"date": "August 15, 2015"
}
]
最重要的是,这里有一些持久化表排序顺序的方法:
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]));
}
}
}