以编程方式选择时,ListView不显示所选项目

时间:2013-07-01 20:34:53

标签: listview javafx-2 javafx

我有两个列表视图,我在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大小更长的列表都不会向下滚动到所选项目。

1 个答案:

答案 0 :(得分:1)

尝试下一个代码

 this.listDirectories.getSelectionModel().clearSelection();
        this.listDirectories.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
        if (this.textToSearch.getText().length() > 0) {
            for (int i = 0; i < this.listDirectories.getItems().size(); i++) {
                SMPBDirectory oneDir = (SMPBDirectory) this.listDirectories.getItems().get(i);
                if (oneDir.name.toLowerCase().contains(this.textToSearch.getText().toLowerCase())) {
//Now magic
                    this.listDirectories.getSelectionModel().select(i);
                    this.listDirectories.getFocusModel().focus(i);
                    this.listDirectories.scrollTo(i);
                }
            }
        }

对我而言,它正在运行,但我使用JavaFX 8。

现在已经修好了。