我在 JavaFX 项目中使用了两个列表视图,它们代表项目的类别。第一个在初始化期间使用单个可观察列表设置并且永远不会更改。但是,第二个 ListView 会根据从第一个 ListView 中选择的项目而变化。与一堆其他项目一起,选定的项目被保存到一个对象中以供以后编辑。
当用户想要编辑他们保存的对象之一时,我会重复使用相同的 fxml 文件和控制器。我遇到的问题是,虽然我可以以编程方式显示第一个列表视图、其可观察列表和所选项目,还可以显示第二个列表视图和基于已保存项目的 catagory1 数据字段的适当可观察列表,但我可以'似乎没有让它显示该项目已被选中,我也不能让它在它应该滚动第二个 ListView 时。任何帮助将不胜感激!
这是我的代码中处理这些操作的部分......
首先,这部分在 initialize() 部分:
category1ListView.getSelectionModel().select(inventoryItem.getCategory(1));
showCategory2();
ObservableList items = category2ListView.getItems();
int range = items.size();
for(int count = 0; count < range; count++){
String item = (String) items.get(count);
if(inventoryItem.getCategory(2).matches(item)){
category2ListView.scrollTo(count);
category2ListView.getSelectionModel().select(item);
category2ListView.getFocusModel().focus(count);
}
这是“showCategory2()”供参考:
public void showCategory2(){
String selectionString = category1ListView.getSelectionModel().getSelectedItem();
if(selectionString.matches("Art")) {
category2ListView = new ListView<String>(artList);
} else if (selectionString.matches("Books")){
category2ListView = new ListView<String>(booksList);
} else if (selectionString.matches("Decorative Accessores")){
category2ListView = new ListView<String>(decorativeAccessoriesList);
} else if (selectionString.matches("Floor Coverings")){
category2ListView = new ListView<String>(floorCoveringsList);
} else if (selectionString.matches("Furniture")){
category2ListView = new ListView<String>(furnitureList);
} else if (selectionString.matches("Kitchen & Tabletop")){
category2ListView = new ListView<String>(kitchenAndTabletopList);
} else if (selectionString.matches("Lighting")){
category2ListView = new ListView<String>(lightingList);
}
等等...通过我的其余列表。一些列表中只有几个项目,其他列表有 7 到 15 个项目,这比在第二个 listView 中能够查看的要多。我不想改变列表视图的大小以适应最大的列表。我宁愿它酌情滚动。
注意:我已经投入了一些测试代码,例如:
System.out.println("Selected item: "
+ category2ListView.getSelectionModel().getSelectedItem());
它显示了先前选择的适当项目......但是第二个列表视图本身没有显示选择了哪个项目,也没有在应该滚动到正确的项目时。
有任何想法吗?
编辑:在对我的代码进行一些测试后,我发现问题似乎只有在我也使用 ListView.scrollTo() 方法时才会出现。如果我从代码中删除 scrollTo 方法,列表视图会正确显示并突出显示所选项目。
然而,这相当不方便,因为这意味着我拥有的任何长度超过我的 listView 大小的列表都不会向下滚动到所选项目。