在JavaFX中更改项目时使用ListView的ClassCastException';类型
我正在处理应用程序的表示层,在JavaFX的“listview”中遇到了一些问题 在应用程序的GUI中,我打算使用一个listview元素交替(从不同时)显示两个不同对象的列表:类型为“组”的对象和类型为“支出”的对象 当用户想要查看所有组的列表时,调用以下函数(此处简化):在JavaFX中更改项目时使用ListView的ClassCastException';类型,java,listview,javafx,classcastexception,Java,Listview,Javafx,Classcastexception,我正在处理应用程序的表示层,在JavaFX的“listview”中遇到了一些问题 在应用程序的GUI中,我打算使用一个listview元素交替(从不同时)显示两个不同对象的列表:类型为“组”的对象和类型为“支出”的对象 当用户想要查看所有组的列表时,调用以下函数(此处简化): private void loadGroups(){ List<Group> groups = getGroups(); ObservableList<Group> ol =
private void loadGroups(){
List<Group> groups = getGroups();
ObservableList<Group> ol = FXCollections.observableList( (List<Group>)groups );
myListView.setCellFactory( new Callback<ListView<Group>, ListCell<Group>>() {
@Override
public ListCell<Group> call(ListView<Group> listView) {
return new GroupCell();
}
});
myListView.setItems(ol);
myListView.setOnMouseClicked(...);
}
如果用户首先查看组列表,然后决定查看支出列表,则会发生以下错误:
Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: DATA.Model.Expenditure cannot be cast to DATA.Model.Group
我在这里不知所措。细胞工厂和可观察列表正在被正确替换 您是如何声明myListView的 我认为问题在于,当您更换cell factory时,它会立即尝试显示当前项目,当然这些项目的类型是错误的。如果你真的想这样做,试试看
myListView.getItems().clear();
在更换电池工厂之前
不过,所有这些看起来都像是一个大黑客。键入了一个
列表视图
,您应该这样使用它。您确实无法在运行时更改其类型。是否有任何理由不简单地切换到不同的列表视图
(即在列表视图
和列表视图
之间切换,而不仅仅是重新配置单个列表视图
)
我认为问题在于,当您更换cell factory时,它会立即尝试显示当前项目,当然这些项目的类型是错误的。如果你真的想这样做,试试看
myListView.getItems().clear();
在更换电池工厂之前
不过,所有这些看起来都像是一个大黑客。键入了一个
列表视图
,您应该这样使用它。您确实无法在运行时更改其类型。是否有任何理由不简单地切换到不同的列表视图
(即在列表视图
和列表视图
之间切换,而不仅仅是重新配置单个列表视图
)?myListView链接到fxml文件中描述整个场景的标记。代码如下:“@FXML ListView myListView;”我理解您关于为每个对象使用一个ListView的观点。然而,就视觉效果而言,我希望这两个列表在应用程序窗口中占据相同的空间。我可以使用什么策略来实现这一目标?谢谢@ismarlowe对于泛型类使用原始类型基本上是一个错误,除非您这样做是出于向后兼容性的原因。例如,可以在FXML文件中创建两个列表视图,将它们放在堆栈窗格中,并切换它们的可见性。myListView链接到FXML文件中描述整个场景的标记。代码如下:“@FXML ListView myListView;”我理解您关于为每个对象使用一个ListView的观点。然而,就视觉效果而言,我希望这两个列表在应用程序窗口中占据相同的空间。我可以使用什么策略来实现这一目标?谢谢@ismarlowe对于泛型类使用原始类型基本上是一个错误,除非您这样做是出于向后兼容性的原因。例如,您可以在FXML文件中创建两个列表视图,将它们放在堆栈窗格中,并切换它们的可见性。
myListView.getItems().clear();