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

JavaFX8中listview单元格中的自定义控件fxml

淳于昊然
2023-03-14

我有一个由几个标签控件组成的自定义控件:日期、标题、文本等,控件有fxml文件和一个控制器。我想将此控件用作ListView的单元格。我创建了一个自定义列表单元格

public class NoteTextCell extends ListCell<Note>{
//....
    protected void updateItem(Note note, boolean isEmpty){
       if(isEmpty|| note == null){
        //....
        }
        else {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/note.fxml"));
            Node node = loader.load(); 
            setGraphic(node);
        }

    }
}

但我不确定这是一个正确的做法。我的应用程序中的ListView可能有数千个项目。根据我的理解,在创建图形节点之前,每次单元格更新都必须加载fxml、进行解析和其他操作。有没有更好的办法来解决这个问题?

共有1个答案

夏青青
2023-03-14

为每个单元加载一次FXML,并在updateItem(...)方法中根据需要配置它:

public class NoteTextCell extends ListCell<Note>{

    private final Node graphic ;
    private final NoteController controller ;

    public NoteTextCell() throws IOException {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/note.fxml"));
        graphic = loader.load(); 
        controller = loader.getController();
    }

    @Override
    protected void updateItem(Note note, boolean isEmpty){
        if(isEmpty|| note == null){
            setGraphic(null);
        }
        else {
            // configure based on note:
            controller.setText(...);
            controller.setXXX(...);
            setGraphic(graphic);
        }

    }
}

这里假设FXML文件声明了一个控制器类NoteController,并且您在其中定义了为特定Note配置UI所需的方法。

这样,对于创建的每个单元格只加载一次FXML(无论列表中有多少项,可能不会超过20个左右),并且当用户滚动或重用单元格时,根据需要调用更新它的(相对有效的)方法。

 类似资料:
  • 我试图使用JavaFX8创建一组自定义控件。我有点困惑什么是正确的方法来做一些事情,比如布局我定义的孩子来构建我的控件。我用来重写layoutChildren()方法,在其中重新定位和调整子元素的大小;但是阅读javadoc中的layoutChildren()是这样写的: 在布局传递期间调用,以布局此父级中的子级。默认情况下,它只将托管的、可调整大小的内容的大小设置为它们的首选大小,而不进行任何节

  • 我想在列表视图中创建一个自定义单元格。原谅我英语不好!我想在列表视图中显示图片、名称和状态。为此,我使用了另一个包含Hbox的Fxml。

  • 本文向大家介绍浅谈ASP.NET中最简单的自定义控件,包括了浅谈ASP.NET中最简单的自定义控件的使用技巧和注意事项,需要的朋友参考一下 ASP.NET用户控件一般适用于产生相对静态的内容,所以没有builtin的事件支持。本文讨论用户控件返回事件的方法。  假定用户控件(UserControl.ascx)中包含按钮控件AButton,希望实现按AButton按钮时,包含该用户控件的页面可以接收

  • 我正在尝试用一个自定义的控件替换默认的传单层控件。 我关注了另一个关于创建自定义层控件的帖子。 我可以通过层名,我已经用console.log检查了这一点。 但是,取消选中该复选框并不会删除该层。

  • 我一直在研究一个传单地图,其中有许多静态层,可以使用传单的标准层控件关闭和打开。 最近,我一直在尝试使用onclick方法运行函数,当用户单击图例中的一个图像时,从地图中添加和删除层。我尝试了许多不同的方法来实现这一点,我认为这与javascript和web页面元素的加载顺序有关(但我对此相当陌生,所以我可能错了)。 无论如何,在不粘贴太多代码的情况下,我在文档的头部加载了所有脚本:

  • 我想创建一个自定义控件,在其中我可以设置另一个自定义控件的列表,并且我想能够像在JavaFXTableView中一样使用FXML(请参见列列表): 我只想写这样的东西: 我已经知道如何实现简单的自定义控件,但我还没有找到任何关于以这种方式组合自定义控件的方法。你能给我指个方向吗?