我正在使用一个ListView
在 JavaFX 应用程序中。列表中的项目需要的不仅仅是一个字符串来显示它们,所以我做了一个自定义实现ListCell<T>
, where T
是我正在显示的对象的类。在这个自定义类中,我创建了一个BorderPane
在构造函数中并重写updateItem(T item, boolean empty)
。这个想法是当updateItem
被调用,我将单元格的图形设置为 BorderPane,同时更改一些属性Label
就在里面。然而,我注意到updateItem
不会被调用一次(例如,当通过滚动回收单元格或添加新项目时),但会调用每时每刻,例如当焦点从一个单元格更改为另一个单元格(即使不滚动)时,或者调整场景大小时,或者按下边框窗格内的按钮时,...
我需要有一个ListView
与定制ListCell
s。我想收到one重用单元格时的回调,将要呈现的新项目作为参数传递。然后我想使用该项目作为模型来构造一个视图控制器对,我将其中的视图用作graphic
细胞的。该视图内的按钮和其他控件应该可以工作。这在 JavaFX 中可能吗?
关联问题:
- ListView 中奇怪的单元格回收 - JavaFX https://stackoverflow.com/questions/20661474/weird-recycle-of-cells-in-listview-javafx
-
每个单元格中带有按钮的 javafx listview https://stackoverflow.com/questions/23137131/javafx-listview-with-button-in-each-cell(顺便说一句,我已经完成了这个操作,并且按钮回调有效,但是仍然有太多的回调
updateItem
)
基本思想是细胞很少被构建,但updateItem(...)
该方法可能会被频繁调用。无法实际保证该项目在调用之间确实发生了变化updateItem(...)
。默认实现updateItem(...)
负责处理选择、焦点等,因此如果这些属性中的任何一个发生更改(即使该项目没有更改),可能需要调用此方法。
因此,您应该努力减少updateItem(...)
方法。目前尚不清楚多次、频繁的调用是否会阻止您执行您想要的操作(例如,当您将新项目作为参数传递给模型时,请在进行任何更新之前检查它是否与您已有的项目确实不同) 。
我认为updateItem(...)
确实有点名不副实:它不仅在以下情况下被调用item
已更新,但实际上任何时候单元格都可能需要更新。已经有一种机制仅在以下情况下执行代码:item
但变化是:只需向单元格注册一个侦听器itemProperty()
。您可以使用这种技术(我通常更喜欢)来创建不同风格的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 ;
});
这种方法在您的场景中可能效果更好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)