我需要使表格始终按特定列排序(当启用某些设置时).例如,当用户按他想要的列对表进行排序时,程序将自动添加另一列进行排序.
这是我的代码-程序必须始终按ID ASC排序:
public class JavaFxTest7 extends Application {
private static record Student(int id, String name, int mark) {};
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
var table = this.createTable();
table.getSortOrder().addListener((ListChangeListener<? super TableColumn<Student, ?>>)(change) -> {
//if some settings enabled then
var idColumn = table.getColumns().get(0);
if (!table.getSortOrder().contains(idColumn)) {
idColumn.setSortType(TableColumn.SortType.ASCENDING);
table.getSortOrder().add(0, idColumn);
}
});
var scene = new Scene(table, 300, 200);
stage.setScene(scene);
stage.show();
}
private TableView<Student> createTable() {
var table = new TableView<Student>();
table.getItems().addAll(new Student(1, "Billy", 3),
new Student(2, "Johnny", 4), new Student(3, "Mickey", 5));
var idColumn = new TableColumn<Student, Integer>("ID");
idColumn.setCellValueFactory((data) -> new ReadOnlyObjectWrapper<>(data.getValue().id()));
var nameColumn = new TableColumn<Student, String>("Name");
nameColumn.setCellValueFactory((data) -> new ReadOnlyStringWrapper(data.getValue().name()));
var markColumn = new TableColumn<Student, Integer>("Mark");
markColumn.setCellValueFactory((data) -> new ReadOnlyObjectWrapper<>(data.getValue().mark()));
table.getColumns().addAll(idColumn, nameColumn, markColumn);
table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY_FLEX_LAST_COLUMN);
return table;
}
}
这就是结果:
按ID排序始终按计划添加.问题是,使用我的解决方案,不可能删除按其他列排序-无论您点击name
列多少次,name
列始终存在于sortOrder
列表中.
有人能告诉我如何修复它吗?