当前位置: 首页 > 知识库问答 >
问题:

ListView无法使用JavaFX FXML正确更新

谭卜鹰
2023-03-14

在JavaFX中,我使用ListView显示添加到集合或从集合中移除的项目。我已经创建了一个observableSet,用于与ListView一起显示更新,但当集合更改时,ListView没有正确更新。这是我的代码和解决方法。但为什么它没有按预期工作?

public class FXMLDocumentController implements Initializable {
    @FXML
    private ListView listView;
    ObservableSet<String> observableSet; //ObservableSet to prevent dublicates
    Integer i = 3;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
        observableSet = FXCollections.observableSet();
        observableSet.addAll(Arrays.asList("Item1", "Item2", "Item3")); 
        //Setting up ListView to the ObservableSet
        listView.setItems(FXCollections.observableArrayList(observableSet));

    }
    @FXML
    private void handleButtonAction(ActionEvent event) {
        observableSet.add("Item" + i++);
       //Setting up ListView to the ObservableSet otherwise it won't update
       //My understanding that I don't have to do this with an observableSet
        listView.setItems(FXCollections.observableArrayList(observableSet));
    }
    @FXML
    private void handleRemoveAction(ActionEvent event) {
       observableSet.removeAll(listView.getSelectionModel().getSelectedItems());
       //Setting up ListView to the ObservableSet otherwise it won't update
       listView.setItems(FXCollections.observableArrayList(observableSet));
    }
}

问题:每次更新可观察集时,我必须继续设置ListView,如上图和下图所示。否则更改不会显示在ListView中。

listView.setItems(FXCollections.observableArrayList(observableSet));

共有2个答案

宋翔
2023-03-14

这是预期的行为。您正在调用的创建可观察列表的方法“创建一个新的可观察列表,并将[集合]的内容添加到其中”。因此,对集合的后续更改不会更改列表。

另一种选择是使用可观察集注册侦听器,并通过适当添加或删除元素来更新列表视图的项目:

public class FXMLDocumentController implements Initializable {
    @FXML
    private ListView listView;
    private ObservableSet<String> observableSet; //ObservableSet to prevent dublicates
    private int i = 3;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
        observableSet = FXCollections.observableSet();

        observableSet.addListener((SetChangeListener.Change<? extends String> c) -> {
            if (c.wasAdded()) {
                listView.getItems().add(c.getElementAdded());
            }
            if (c.wasRemoved()) {
                listView.getItems().remove(c.getElementRemoved());
            }
        });

        observableSet.addAll(Arrays.asList("Item1", "Item2", "Item3")); 

    }
    @FXML
    private void handleButtonAction(ActionEvent event) {
        observableSet.add("Item" + i++);
    }
    @FXML
    private void handleRemoveAction(ActionEvent event) {
       observableSet.removeAll(listView.getSelectionModel().getSelectedItems());
    }
}
寿毅庵
2023-03-14

试试打电话

listview.refresh();

从列表中添加和删除项目后。

或者,您可以在列表中添加更改侦听器,并从中调用refresh方法。但我更喜欢第一种方法,因为添加侦听器有时不会更新列表视图。

 类似资料:
  • 问题内容: 抱歉,我真的很想念React中子组件内部的传递。 我已经实现了一个包含3个组件的待办事项列表。 有一个组成部分和一个组成部分。状态仅存储在组件中。 显示器起步不错,因此可以看到道具。但是在提交表单后,我收到了以下错误: TypeError:this.props.tasks.map不是函数 当我console.log时,我没有得到我的数组,而是数组的长度。 你知道为什么吗? 编辑 :谢谢

  • 问题内容: 我是一个新用户,正在尝试此命令。 我得到这个错误 我知道这似乎是一个琐碎的问题,但我坚持下去。 问题答案: 如果编译和安装的代码是 不是 在分支(签出由默认值),但只有在该回购的分支,尝试: 然后重试编译。

  • 请读到最后(我在最后提到console.log) 模型: 收藏: 观点: 在我们的应用程序中。js 服务器输出 我还尝试从模型中删除所有属性防御。还是不行。返回值内容类型为:application/json(已验证),并且是有效的json。 我读过:Backbonejs集合长度总是零 但尽管console.log,显示0长度,也: 不工作! 我还读了Did主干收集自动解析加载的数据 非常感谢 更新

  • 我不知道为什么我的json解析不起作用。这是我正在使用的Api。还有完整json输出的链接http://api.openweathermap.org/data/2.5/forecast/daily?zip=85008 我试图得到每天的最低和最高温度。这是我的代码。引发的异常应该是BEGIN_OBJECT,但在第1行第190列编号。任何帮助不胜感激,谢谢!

  • 我试图使一个计算器与一定的输入,是输入像+5或/10 2。当我编译并运行它时,我会得到以下错误: 线程“main”java.util.NoSuchelementException 在java.util.scanner.throwfor(Scanner.java:907) 在java.util.scanner.next(Scanner.java:1416) 在calc.main(calc.java:

  • 我使用和。我有一个带有方法的控制器,其中包含作为url参数的数组: 为什么会发生这种情况?为什么项目中没有显示示例数组?