具有自定义单元格工厂的 ListView 修剪不可见节点
我的布局问题
我有一点问题,我不确定是因为我缺少一些知识还是我的方法有缺陷。不得不承认,我还不清楚JavaFX在很多可能的情况下如何处理布局。ListView
上面的屏幕截图显示了我使用完全相同的代码获得两次的结果,除了在第二个屏幕截图上,我用于连贯布局的不可见形状对于调试是可见的。
扩展所涉及的各种类,我尝试了其他一些,但到目前为止没有取得多大成功。CellFactory
Group
Parent
如何重现
我没有分享我的,和其他一些杂项类(如果需要,我很乐意这样做),而是写了一个示例来复制这个问题。该类按如下方式扩展和重写该方法:StarShape
StarRow
Application
start(...)
@Override
public void start(Stage primaryStage) throws Exception {
final StackPane root = new StackPane();
final Scene scene = new Scene(root, 400, 600);
final ListView<Boolean> listView = new ListView<>();
listView.setCellFactory(this::cellFactory);
for (int i = 0; i < 5 ; i++) {
listView.getItems().add(true);
listView.getItems().add(false);
}
root.getChildren().add(listView);
primaryStage.setScene(scene);
primaryStage.setTitle("ListView trims the invisible");
primaryStage.show();
}
在哪里this::cellFactory
private ListCell<Boolean> cellFactory(ListView<Boolean> listView) {
return new ListCell<Boolean>() {
@Override
protected void updateItem(Boolean item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setText(null);
} else {
final Rectangle tabShape = new Rectangle();
tabShape.setHeight(20);
tabShape.setWidth(40);
tabShape.setVisible(item);
final Label label = new Label(item.toString());
label.setLayoutX(40);
final Group cellRoot = new Group();
cellRoot.getChildren().add(tabShape);
cellRoot.getChildren().add(label);
setGraphic(cellRoot);
}
}
};
}
上面将在项目前面显示带有黑色形状的(因为位)。这些物品看起来像常规对象,就好像它们中的隐形形状不存在一样(但它是)。ListView<Boolean>
true
tabShape.setVisible(item);
false
Label
Group
结束语
对此进行调试后,事实证明,具有不可见形状的组被赋予负布局X属性值。因此,控件并不像我希望的那样对齐。当我调用和在 a 之外时,它不会发生(不可见的形状会强制偏移),但它可能不是唯一会发生的地方。Label
setLayoutX
setLayoutY
ListView
发生了什么以及如何避免?或者,正如我猜测我处理错了,什么是正确的方法?换句话说,我应该问什么问题而不是这个?