2017-10-19 48 views
0

J'essaie d'afficher certaines données dans un graphique à barres et un graphique à barres empilées à l'aide de JavaFx. J'utilise 4 séries dans lesquelles je peuple les données, en utilisant l'éclipse d'oxygène.Graphique à barres et graphique à barres empilées à l'aide de données similaires sur une page

J'utilise series1 et series2 dans le diagramme à barres. J'utilise series1, series2, series3 et series4 dans le diagramme à barres empilées. J'ai créé mon écran en utilisant JavaFx Scene Builder. Remplissez les scènes et affichez les données. Mon problème est que je ne suis pas capable de montrer les deux graphiques en même temps. Seul ce dernier est peuplé, selon l'ordre de la population. Le bit supplémentaire que j'ai ajouté est que les graphes se développent sur un événement de souris, puis se réduit à la taille originale sur l'événement de sortie de la souris.

Quelqu'un peut-il m'aider en soulignant ce que je fais mal? Mon code est le suivant

@FXML 
private void bcsbg_mouseentered() { 
    if (!clickEntered) { 
     clickEntered = true; 
     prefWidth = bcByGroup.getPrefWidth(); 
     prefHeight = bcByGroup.getPrefHeight(); 
     bcByGroup.setPrefSize(1500, 900); 
     gXAxis.setPrefHeight(Region.USE_COMPUTED_SIZE); 
     gXAxis.setPrefWidth(Region.USE_COMPUTED_SIZE); 
     gYAxis.setPrefHeight(Region.USE_COMPUTED_SIZE); 
     gYAxis.setPrefWidth(Region.USE_COMPUTED_SIZE); 
     gXAxis.setVisible(true); 
     gYAxis.setVisible(true); 
     gXAxis.setLabel("Value"); 
     gYAxis.setLabel("Question"); 
     gXAxis.setTickLabelsVisible(true); 
     gYAxis.setTickLabelsVisible(true); 
     gXAxis.setTickMarkVisible(true); 
     gYAxis.setTickMarkVisible(true); 

     sbcByAll.setVisible(false); 

    } else { 
     clickEntered = false; 
     bcByGroup.setPrefSize(prefWidth, prefHeight); 
     gXAxis.setPrefHeight(0); 
     gXAxis.setPrefWidth(0); 
     gYAxis.setPrefHeight(0); 
     gYAxis.setPrefWidth(0); 
     gXAxis.setVisible(false); 
     gYAxis.setVisible(false); 
     gXAxis.setLabel(""); 
     gYAxis.setLabel(""); 
     gXAxis.setTickLabelsVisible(false); 
     gYAxis.setTickLabelsVisible(false); 
     gXAxis.setTickMarkVisible(false); 
     gYAxis.setTickMarkVisible(false); 

     sbcByAll.setVisible(true); 
     sbcByAll.getData().clear(); 
     sbcByAll.getData().addAll(series1, series2, series3, series4); 

    } 

    bcByGroup.getData().clear(); 
    bcByGroup.getData().addAll(series1, series2); 

} 

Répondre

0

Le problème est pas ici dans votre code, mais dans la façon dont l'API graphique est écrite. (Je ne suis généralement pas fan de critiquer les langages ou les bibliothèques standard, mais certaines parties de cette API semblent avoir été écrites par un stagiaire non supervisé avec une mauvaise gueule de bois particulièrement mauvaise.)

La classe XYChart.Data conserve un reference to the node qui affiche les données . (Cela constitue une violation assez évidemment les principes les plus fondamentaux de MVC, et permet de séparer les données dans une autre classe complètement redondante.)

Par conséquent, si vous essayez d'utiliser les mêmes données dans deux tableaux, le même nœud essaie d'apparaître dans deux parents, ce qui n'est pas autorisé, et vous ne voyez que la visualisation des données en un seul endroit. Malheureusement, vous devez répliquer les données pour chaque graphique.

0

Merci, Dave. Tu as raison. Je n'ai pas parcouru la documentation standard sur le XYData.Chart pour remarquer que cet objet serait attaché au nœud dans lequel les données allaient être affichées.

J'espérais vraiment éviter la réplication mais le code ne fonctionne dès que la série de données sont répliquées et attaché aux différents tableaux.

Comme mentionné par Dave,

La classe XYChart.Data conserve une reference to the node qui affiche les données. (Cela viole de manière assez flagrante les principes les plus élémentaires de MVC, et rend la séparation des données dans une classe complètement redondante.)

Veuillez parcourir la documentation standard fournie dans le lien de Dave.