Mon problème de mise en page
J'ai un petit problème avec l' ListView
et je ne sais pas si c'est à cause de certaines connaissances que j'ai manquant ou si mon approche est erronée. Dois admettre que je ne suis pas encore clair comment JavaFX gérer la mise en page dans le nombre de cas possibles.
La capture ci-dessus montre le résultat je reçois deux fois avec le même code, sauf que sur le second, une forme invisible - je utiliser pour la cohérence de mise en page est visible pour le débogage.
Les différentes classes concernées par l' CellFactory
étendre Group
, j'ai essayé avec quelques autres Parent
sans beaucoup de succès jusqu'à présent.
Comment reproduire
Plutôt que de partager mon StarShape
, StarRow
et certains autres misc classes (j'en serais heureuse si demandé), j'ai écrit un échantillon de reproduire le problème. La classe s'étend Application
et remplace l' start(...)
méthode en tant que telle:
@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();
}
où this::cellFactory
est
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);
}
}
};
}
Le ci-dessus va afficher un ListView<Boolean>
avec des formes noires en face de l' true
articles (en raison de l' tabShape.setVisible(item);
bits). L' false
des articles sont à la recherche comme réguliers Label
objets comme si l'invisible forme dans leur Group
n'était pas là (mais c'est).
Commentaires de clôture
Débogage de cela, il s'avère groupes avec l'invisible formes sont données négatives layoutX les valeurs de propriété. Ainsi, Label
contrôles ne sont pas alignés, comme je voudrais qu'ils soient. Il ne se produit pas quand je l'appelle setLayoutX
et setLayoutY
à l'extérieur d'un ListView
(l'invisible formes ne force les décalages), mais ce n'est probablement pas le seul endroit où il allait se passer.
Ce qui se passe et comment l'éviter? Sinon, comme je devine que je suis en approche de ce mal, ce serait de la bonne façon? En d'autres termes, quelle est la question que je doit demander au lieu de cela?