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

时间:2016-04-03 17:14:27

标签: listview javafx javafx-8

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

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 个答案:

答案 0 :(得分:2)

为每个单元格加载一次FXML,然后在import random for x in range(20): a=random.randint(1000,2000) b=(a>1500) print b print 方法中根据需要进行配置:

updateItem(...)

这里我假设FXML文件声明了一个控制器类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); } } } ,并且您在其中定义了为特定NoteController配置UI所需的方法。

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