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

JavaFX自定义列表单元格,updateItem被大量调用

颛孙航
2023-03-14

我正在 JavaFX 应用程序中使用列表视图。列表中的项需要的不仅仅是一个字符串来显示它们,因此我自定义了 ListCell 的实现

我需要有一个自定义< code>ListCell的< code>ListView,当单元格被重用时,我希望接收一个回调,传递要作为参数呈现的新项。然后,我想使用该项作为模型来构建一个视图-控制器对,我获取该视图并将其用作单元格的< code>graphic。该视图中的按钮和其他控件应该可以工作。这在JavaFX中可能吗?

链接问题:

  • ListView-JavaFX中奇怪的单元格循环
  • javafx listview在每个单元格中都有按钮(顺便说一句,我已经完成了这个操作,按钮回调也可以工作,但是updateItem仍然有太多的回调)

共有2个答案

林祯
2023-03-14

我刚刚开始使用JavaFX,我无法解释它为什么工作的所有小细节(它在新的和现有的项目上调用方法),但我解决问题的方法是简单地调用myContainer.getChildren(). removeAll(…)

在我的列表单公共类MyCell扩展列表单元的实现中

@Override
    public void updateItem(MyContent item, boolean empty) {

        super.updateItem(item, empty);

        if (item == null || empty == true) {
            setGraphic(null);
            setText(null);
        } else {    

            // here I user the "item" to decide how to create 
            // objects a, b, c ... which are Rectangle, Label and Label
            // I also update myMainContainer, which is a Pane

            myMainContainer.getChildren().removeAll(a, b, c);
            myMainContainer.getChildren().addAll(a, b, c);
            setGraphic(myMainContainer);
        }
    }

郜振国
2023-03-14

基本思想是很少构造单元格,但可能会频繁调用updateItem(…)方法。无法实际保证在调用updateItem(…)之间该项确实发生了更改。updateItem(…)的默认实现负责处理选择、焦点等,因此,如果这些属性中的任何一个发生更改(即使项没有更改),可能需要调用此方法。

因此,您应该努力减少updateItem(…)方法的开销。目前还不清楚多次频繁的调用是否会阻止您执行您想要的操作(例如,当您将新项目作为参数传递给模型时,请在进行任何更新之前检查它是否与您已经拥有的项目确实不同)。

我认为< code>updateItem(...)确实有点名不副实:它不仅在更新< code>item时被调用,而且实际上在任何需要更新单元格的时候都会被调用。已经有了一种仅在< code>item发生变化时才执行代码的机制:只需用单元格的< code>itemProperty()注册一个侦听器。您可以使用这种技术(我通常更喜欢)来创建不同风格的< code>ListCell:

ListView<...> listView = ... ;
listView.setCellFactory(lv -> {
    BorderPane cellRoot = new BorderPane();
    // create nodes, register listeners on them, populate cellRoot, etc...
    ListCell<...> cell = new ListCell<>();
    cell.itemProperty().addListener((obs, oldItem, newItem) -> {
        if (newItem != null) {
            // update cellRoot (or its child nodes' properties) accordingly
        }
    });
    cell.emptyProperty().addListener((obs, wasEmpty, isEmpty) -> {
        if (isEmpty) {
            cell.setGraphic(null);
        } else {
            cell.setGraphic(cellRoot);
        }
    });
    cell.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
    return cell ;
});

此方法在你的方案中可能效果更好。

 类似资料:
  • 问题内容: 在我的应用程序中,我有一个表格视图,每个单元格中都有一个图像,标签和文本视图。我希望能够根据文本视图中的内容量自动调整单元格的大小。(文本视图是最下面的文本。) 到目前为止,我已经添加了正确的约束。文本视图的前导,尾随,顶部和底部,并且已禁用滚动和编辑。 在我的tableViewController.swift文件中,我编写了以下代码: 但是,这不起作用,因为当我在文本视图中添加更多文

  • 我正在尝试使用基于自定义列表的自定义创建一个自定义。 自定义对象是名为的类名,其中包含一些用于消息内容、收件人、时间戳和状态(读取、发送等)的字段。 在看了这个问题:用FXML在JavaFX中定制ListView之后,我成功地做到了: null 现在,ConversationCell类: 我不能显示ConversationCellController,但我所能说的是,这是我(在其构造函数中)加载设

  • 我想问一下在JavaFX中使用自定义对象创建ListView的最佳方法,我想要一个列表,每个项目如下所示: 我搜索发现大多数人都是用细胞工厂的方法来做的。还有别的办法吗?例如,使用custome fxml? 这是我的fmxl档案 这是我的对象任务: 我想让物品看起来像单个容器,但我没有找到任何方法。关于使用什么有什么建议吗?最好的方法是什么?

  • 我按照本教程创建了一个自定义。xib,我计划在表格视图的单元格中使用它: https://medium.com/@brianclouser/swift-3-creating-a-custom-view-from-a-xib-ecdfe5b3a960 以下是我创建的 .xib 类: 以前,我在情节提要中创建我的表视图单元格,但我已经意识到我想要一个更灵活的视图,以便我可以在应用的不同部分使用它,所以

  • 问题内容: 我正在尝试用Java编写程序来管理我的Bookie帐户。我是java的新手,所以我认为我会选择一些简单的方法来了解事情的原理。我决定使用表格视图并使各个单元格可编辑。我一直在关注本教程http://java- buddy.blogspot.co.uk/2012/04/javafx-2-editable-tableview.html 。它详细说明了如何使用Java代码执行此操作,并将其复

  • 问题内容: 我正在将AutoSizing单元格与Autolayout和UICollectionView一起使用。 我可以在单元初始化的代码中指定约束: 但是,由于该单元尚未添加到中,该应用程序崩溃了。 问题 在该阶段的生命周期,可以添加一个约束的? 有没有作出任何默认方式的equal to the of thewithout accessing an instance of or? 编辑 这个问题