Comment obtenez-vous JavaFX ListView à la hauteur de ses éléments?
Si je créer une ListView:
new ListView<>(FXCollections.observableArrayList("1", "2", "3"))
Je m'attends à créer une ListView avec 3 lignes. Mais il ne le fait pas. Il crée une liste de 17 ou si les lignes. Est-il un moyen de dire ListView pour toujours être à la hauteur telle que, quel que soit les articles sont toujours affichés, mais pas de lignes vides?
D'avoir la largeur auto serait également utile, il est donc toujours aussi large que la plus grande ligne.
Un but de cela est qu'il pourrait être utilisé dans un ScrollPane. Je sais qu'il a ses propres barres de défilement, mais ils ne proposent pas un contrôle suffisant.
- Vous pouvez utiliser css afin que les nouvelles lignes vides dans une liste ne sont pas visibles. Il n'est pas tout à fait le même que le dimensionnement de la liste elle-même à la hauteur de ses éléments, mais c'est peut-être suffisant pour vous.
- J'ai vu des exemples de cela, mais ce n'est pas ce dont j'ai besoin.
- Pour vos besoins, je vous suggère d'utiliser un VBox dans un ScrollPane au lieu d'un
ListView
. - J'ai vu des exemples de ce que, trop. C'est un peu frustrant que la première solution à la liste des questions est de vidage et rouler votre propre.
- taotree - à l'avenir, je vous conseille de résumer dans votre question, les résultats de la recherche avant que vous avez fait sur le problème de l'espace.
Vous devez vous connecter pour publier un commentaire.
Malheureusement, il n'est pas agréable, propre Propriété de la taille d'un ObservableList pour nous lier. Au lieu de cela, c'est faisable par l'ajout d'un ListChangeListener sur la liste, au moins, c'est comment je l'ai fait dans le passé. Par défaut, la taille de chaque ligne doit être 24px, et nous avons besoin d'un pixel supplémentaire sur le haut et le bas pour la liste des bords. Sinon, nous avons encore de la liste de la barre de défilement de l'affichage. Nous allons d'abord créer le ObservableList et la ListView, et de définir la hauteur initiale de la liste:
Maintenant, nous devons ajouter un ListChangeListener à la ObservableList. Lorsque la liste des changements, il nous suffit de modifier la hauteur de la ListView pour correspondre à la nouvelle nombre de lignes. Si nous savons que nous n'allons jamais d'ajouter ou de supprimer des éléments de la ObservableList qui est la sauvegarde de la liste, alors nous pouvons exclure l'auditeur. Encore une fois, la hauteur est le nombre de lignes à la fois la hauteur par ligne, plus de deux pixels supplémentaires pour les frontières:
Références:
JavaFX ListView Documentation, JavaFX ObservableList Documentation
list.lookup(".list-cell").getHeight()
? cela vous permet de définir la taille dans le css.Je viens de découvrir que Paul Marshall réponse peut être réduite à un one-liner à l'aide de Les liaisons.taille qui crée un numérique, jfx propriété représentant de la taille d'un ObservableList :
La liste la hauteur de la cellule doit malheureusement toujours être codé en dur autant que je sache.
Vous êtes à la recherche pour que:
Cela va masquer le vide de la cellule.
Je l'ai trouvé relativement facile, mais encore légèrement hacky solution qui fonctionne sous l'hypothèse que tous les non-vide, les cellules ont la même hauteur: au lieu d'analyser css ou quelque chose du genre, ajouter un
InvalidationListener
à votrelistView.getItems()
; la première fois vos éléments de liste est non-vide, vous récursive passer par laListView
s enfants jusqu'à ce que vous trouver un exemple deListCell
où!cell.isEmpty()
, et de stocker la valeur decell.getHeight()
. Assurez-vous d'envelopper ce code dans unPlatform.runLater()
de sorte qu'il est exécuté une fois que leListView
layouting est fait. Une fois que vous avez que de la hauteur, vous multipliez aveclistView.getItems().size()
et appellistView.setMaxHeight
avec la valeur résultante (toujours à l'intérieur de laInvalidationListener
).lookup(".list-cell")
et vous avez terminé.StackOverflow du système de réputation est de m'empêcher de faire un commentaire sur Paul Marshall réponse, mais je voulais ajouter pour quiconque cherche à ce que son 24px estimation pour les lignes sont "généralement", confirmé par le fonctionnaire en Charge de la documentation - voir "fixedCellSize" à http://download.java.net/jdk8/jfxdocs/javafx/scene/control/ListView.html:
Ainsi, alors que je suis d'accord que "[f]iguring les lignes de la hauteur, de la largeur de bordure, etc., en quelque sorte, de style ou de choses difficiles est en désordre, mais probablement la seule façon de le faire" peut-être vrai, en commençant par une hypothèse appuyée par des documents officiels est un bon endroit pour commencer, et semble entraîner la décence, à la recherche de listes dans mes tests sur une liste (à l'aide de Java 7).
Après avoir travaillé dur et basé dans le @warakawa réponse, j'ai trouvé la solution. Comme nous le savons tous, la mise en œuvre de la Listview est à l'origine de beaucoup de maux de tête, parce que de ce que j'ai écrit deux classes qui résout le problème de la "PREF_SIZE" (qui est une constante de 400 pour la hauteur et la largeur est calculée en fonction de la hauteur). La peau de la classe que j'ai écrit calcule la taille comme nous le prévoyons, et empêche aussi laid barre horizontale lorsque la nouvelle propriété "fillWidth" est changé à "true", cette propriété entraîne la croissance de cellules horizontalement autant que possible. Ce qui concerne.
ListViewFixed.java
ListViewFixedSkin.java
AVERTISSEMENT
Il y a quelques corrections à faire à ListViewFixedSkin.java classe. Par où je dois passer par des méthodes de référence directement, il doit être stocké dans une variable et ensuite, vous passez la variable dans ajout/attachments/supprimer/détachements de méthodes. Sinon, cela peut entraîner des problèmes de mémoire.
Essayer de setPrefHeight(double) dans la sous-classe de ListCell. Par exemple dans mon code
Exemple d'Image pour définir ListView Hauteur
Si vous avez une liste statique , Vous pouvez définir l'affichage de la liste de la hauteur avec la méthode setter qui vient avec la liste de classe setPrefHeight
J'ai basé ma réponse sur les réponses fournies par @scribbleslims et @Alexandre mazar-e
listView.setPrefHeight(listView.getItems().size() * LIST_CELL_HEIGHT);
Vous devez définir
LIST_CELL_HEIGHT
sur votre propre.Dans mon cas, j'ai utilisé 29.501.