【发布时间】:2017-08-18 09:59:23
【问题描述】:
我的布局问题
我对@987654325@ 有一点问题,我不确定是因为我缺少一些知识还是我的方法有缺陷。不得不承认,在许多可能的情况下,我还不清楚 JavaFX 如何处理布局。
上面的屏幕截图显示了我使用完全相同的代码两次得到的结果,除了 在第二个上一个不可见的形状我用于连贯布局对调试可见.
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);
}
}
};
}
上面将在true 项目前面显示一个带有黑色形状的ListView<Boolean>(因为tabShape.setVisible(item); 位)。 false 项目看起来像普通的 Label 对象,好像它们的 Group 中的不可见形状不存在(但确实存在)。
关闭 cmets
对此进行调试,结果发现具有不可见形状的组被赋予负的 layoutX 属性值。因此Label 控件没有像我希望的那样对齐。当我在 ListView 之外调用 setLayoutX 和 setLayoutY 时不会发生这种情况(不可见的形状会强制偏移),但它可能不是唯一会发生这种情况的地方。
发生了什么以及如何避免它?或者,我猜我正在接近这个错误,正确的方法是什么?换句话说,我应该问什么问题而不是这个?
【问题讨论】:
-
标签在其容器内居中的事实是问题#1,可能与矩形形状问题无关。
label.setAlignment(Pos.CENTER_LEFT);#2 之类的东西:你似乎需要隐形形状作为没有星级的物品的占位符?尝试使矩形透明而不是不可见。或者采用呈现评分栏的代码,并添加一个零星版本。 -
...现在没有人敢因为这个disclaimer on meta而将其详细说明为答案
-
@dlatikay 好吧...用户仍然有权忽略免责声明并回答您知道的...并且任何强大到做到这一点并从社区获得 2 票的人将获得一半的赏金; )
-
@dlatikay:是的,需要占位符,因此所有“星标标签”都具有相同的宽度和高度。您的建议很好,目前无法尝试,但很快就会尝试。
-
@dlatikay 免责声明是voided by OP。赏金仍然可用,因为它不能授予我自己。
标签: java listview layout javafx