Implémentation de BarChart JavaFX-pourquoi utiliser StackPanes pour les barres?


J'ai examiné assez profondément les implémentations des graphiques dans JavaFX dernièrement et j'ai remarqué cela dans BarChart.java , les empileurs sont utilisés pour les barres individuelles, comme ceci:

bar = new StackPane();
item.setNode(bar);
bar.getStyleClass().addAll("chart-bar", "series" + seriesIndex, "data" + itemIndex);

Plus tard (dans layoutPlotChildren(...)):

bar.resizeRelocate(xPos, bottom, barWidth, top - bottom);

Il me semble qu'un choix plus logique serait d'utiliser un rectangle, d'autant plus que le JavaFX Peformance Tips and Tricks indique que l'utilisation de classes de forme (même si elles doivent être recréées car elles ne sont pas directement redimensionnable est plus rapide que l'utilisation d'une Région/Volet).

La principale raison pour laquelle je pose cette question est parce que j'ai une implémentation de graphique personnalisée (un graphique en bâton de bougie) qui utilise des rectangles pour les bougies, et je veux que les barres soient stylisées de la même manière. Créer une classe de style pour un Rectangle utilise différents attributs CSS(-fx-fill, -fx-smooth, -fx-stroke, etc.) alors qu'une région/volet utilise -fx-background-color, -fx-border-color et n'a même pas la possibilité de spécifier {[4] } donc je ne peux pas utiliser une classe de style principale pour le les bougies ET les bars.

Le fait que BarChart utilise StackPane pour les barres me laisse avec quelques questions:

  • Pourquoi? Est - ce pour une raison de performance étrange que je ne comprends pas?
  • Le choix est-il arbitraire et une autre implémentation qui est à peu près la même mais utilise des rectangles serait-elle aussi bonne?
  • La couleur des barres dans BarChart est spécifiée avec l'attribut -fx-bar-fill (qui n'est pas documenté dans le JavaFX CSS Reference Guide) mais de plus, je ne trouve nulle part dans la source OpenJFX où cet attribut est spécifié et recherché, comment cela fonctionne-t-il réellement?
  • Dans l'implémentation de CandleStickChart dans Ensemble8 Candle.java les bougies individuelles (très similaires aux barres d'un BarChart) sont en fait des groupes contenant une Ligne pour la mèche et une région pour la bougie elle-même. C'est différent de mon implémentation personnelle et différent de l'implémentation de BarChart - encore une fois ce choix arbitraire ou y a-t-il de bonnes raisons d'utiliser ces classes par opposition à 2 rectangles ou un Rectangle et 1 ligne, disons.
Author: brcolow, 2015-04-24

1 answers

Pourquoi utiliser des StackPanes pour les barres?

Je n'ai aucune connaissance des esprits de l'équipe JavaFX, mais je soupçonne que le choix de en raison du support CSS. Parce que StackPane hérite de Region, il prend en charge un ensemble très riche de propriétés stylisables, telles que l'arrière-plan, la bordure et même la forme. Ainsi, dans un BarChart, vous pouvez définir des images d'arrière-plan arbitraires sur les barres en utilisant simplement une feuille de style externe, par exemple. Par contre, Shapes soutenir un ensemble beaucoup plus limité de propriétés styleable. Utiliser un StackPane plutôt qu'un Region directement permettrait, en théorie de toute façon, la possibilité d'ajouter d'autres nœuds à la barre, bien que je pense qu'un tel code serait assez laid.

La couleur des barres dans BarChart est spécifiée avec-fx-bar-fill attribut... comment cela fonctionne réellement?

-fx-bar-fill est une couleur recherchée qui est définie dans la feuille de style par défaut, modena.css . En général, la documentation de la feuille de style par défaut est médiocre: il n'y a aucun moyen réel de savoir quelles couleurs recherchées sont définies pour quels types de nœuds, à part regarder le code source lié ci-dessus (bien que, en toute justice, il soit difficile de voir à quoi une telle documentation pourrait ressembler sous une forme qui portait les bonnes informations et

Dans l'implémentation de CandleStickChart dans Ensemble8... encore est-ce choix arbitraire ou sont là bonnes raisons d'utiliser ces classes comme opposé à 2 Rectangles ou un Rectangle et 1 ligne, disons.

Étant donné qu'un nœud de graphique en chandelier ressemble à une ligne et à un rectangle, l'utilisation d'un Group contenant une ligne et autre chose a du sens. Si vous acceptez l'argument sur CSS pour le graphique à barres, l'utilisation d'une sous-classe Region ou Region a du sens pour moi.

 3
Author: James_D, 2015-04-23 22:58:24