JavaFX实现支持增删的排序ListView问题求助
问题分析与解决方案
核心原因
ObservableArrayList本身是支持增删操作的,你遇到的UnsupportedOperationException,大概率是因为**tables变量实际指向的不是你初始化的可修改ObservableArrayList实例**——比如后续代码中把它重新赋值成了不可修改的集合(比如用FXCollections.unmodifiableObservableList()包装的集合,或者从List.of()/Arrays.asList()这类不可变普通集合转换时出错)。
解决方案
确保
tables始终指向可修改实例
检查所有对tables的赋值操作,禁止将不可修改集合赋值给它。比如:- 正确初始化:
// 直接创建可修改的ObservableArrayList,后续不要覆盖这个引用 ObservableList<TableData> tables = FXCollections.observableArrayList(); - 如果需要从现有集合初始化,要重新包装成可修改实例:
// 即使源集合是不可变,用ObservableArrayList构造方法会创建新的可修改集合 List<TableData> sourceList = List.of(...); ObservableList<TableData> tables = FXCollections.observableArrayList(sourceList);
- 正确初始化:
SortedList的正确使用(你的写法没问题)
SortedList只是源集合的视图,修改源集合tables会自动同步到SortedList和ListView,不需要移除SortedList。只要tables是可修改的,tables.remove(currentData)就能正常执行,排序状态也会自动保持。关于ObservableSet/ObservableMap的疑问
不需要使用这两个集合:ObservableSet是无序的,无法满足你需要的排序展示需求;ObservableMap是键值对结构,不符合ListView展示列表数据的场景。ObservableArrayList完全能满足你的需求,只要保证它是可修改实例。
修正后的完整示例
// 初始化可修改的数据源 ObservableList<TableData> tables = FXCollections.observableArrayList(); // 绑定排序视图 SortedList<TableData> sortedTables = new SortedList<>(tables); sortedTables.setComparator(TableData.getComparator()); // 绑定到ListView ListView<TableData> tableList = new ListView<>(sortedTables); // 此时执行删除操作不会抛异常 tables.remove(currentData);
内容的提问来源于stack exchange,提问作者Steven Fletcher
相关产品推荐
相关产品推荐

