0

我在 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 大小的列表都不会向下滚动到所选项目。

4

1 回答 1

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。

现在它是固定的。

于 2013-11-20T06:08:27.097 回答