use*_*038 9 events javafx listener tableview
在JavaFX TableView中,如何确定更改
将它们保存在首选项中并恢复它们,下次启动应用程序时?
I.列顺序
现在工作.但是,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)
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
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);
});
}
Run Code Online (Sandbox Code Playgroud)
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);
});
}
Run Code Online (Sandbox Code Playgroud)
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]));
}
}
}
Run Code Online (Sandbox Code Playgroud)
最重要的是,以下是一些保留表排序顺序的方法:
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]));
}
}
}
}
Run Code Online (Sandbox Code Playgroud)