我有一个由几个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,进行解析和其他操作。有没有更好的方法来解决这个问题?
答案 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个),并且会调用(相对有效的)更新它的方法当用户滚动或以其他方式重复使用单元格时,根据需要。