2012-08-25 4 views
4

Lors de la définition de nouvelles données sur un PieChart existant, je remarque que les couleurs ne sont pas les mêmes. (Ils effectuent un cycle autour de la liste des couleurs CSS, comme si un compteur interne n'était pas réinitialisé)javafx 2.2 couleurs de graphique à secteurs ne réinitialisant pas

Comment recommencer les couleurs à la couleur 0, sans recréer le diagramme à chaque fois?

exemple:

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.chart.PieChart; 
import javafx.stage.Stage; 

public class ChartAdvancedPie extends Application { 

PieChart pc = new PieChart(); 

private void init(Stage primaryStage) { 
    Group root = new Group(); 
    primaryStage.setScene(new Scene(root)); 
    root.getChildren().add(pc);   
    pc.setAnimated(false); 
    SetupData(); 
    SetupData(); //comment this out to see first colours only 
} 

protected void SetupData() {   
    ObservableList<PieChart.Data> data = FXCollections.observableArrayList();   
    data.add(new PieChart.Data("Slice", 1)); 
    data.add(new PieChart.Data("Slice", 2)); 
    data.add(new PieChart.Data("Slice", 3)); 
    pc.getData().clear(); 
    pc.setData(data);    
} 

@Override public void start(Stage primaryStage) throws Exception { 
    init(primaryStage); 
    primaryStage.show(); 
} 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Un hack pour conserver l'ordre des couleurs est d'ajouter 8 - mod taille 8 autres articles avant d'effacer, mais je suis sûr qu'il ya un moyen plus facile (ou j'ajouter les données incorrect)

int rem = 8-(pieChartData.size() % 8); 
for (int i=0; i< rem; i++) {       
    controller.FeatureChart.getData().add(new PieChart.Data("dummy", 1)); 
}      
controller.FeatureChart.getData().clear(); 
//... add items again 
+0

Nice hack! J'ai le problème. Je pense que le JavaFX n'est pas encore assez mature pour que tous ces petits bugs soient gérés. – beardedlinuxgeek

Répondre

0

La réinitialisation des couleurs n'est actuellement pas possible. Le champ utilisé pour l'index des couleurs est déclaré privé dans PieChart et il n'existe aucun moyen officiel de le modifier. Cependant, si l'environnement le permet, on peut le réparer avec la réflexion. Modifier la méthode SetupData comme suit:

protected void SetupData() {   
    ObservableList<PieChart.Data> data = FXCollections.observableArrayList();   
    data.add(new PieChart.Data("Slice", 1)); 
    data.add(new PieChart.Data("Slice", 2)); 
    data.add(new PieChart.Data("Slice", 3)); 
    // pc.getData().clear(); 
    try { 
     Class<PieChart> cls = PieChart.class; 
     Field f = cls.getDeclaredField("defaultColorIndex"); 
     f.setAccessible(true); 
     f.setInt(pc, 0); 
    } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
    pc.setData(data); 
} 

Ne l'utilisez pas.

Si vous devez:

Le f.setAccessible(true) permet de définir les champs privés. Cela peut échouer et dans des configurations raisonnablement bien configurées, il échouera. Si votre application est un petit outil de bureau, cela peut fonctionner. Aussi, vous pouvez vérifier la version java avant de faire cela et activer le code uniquement pour les versions pour lesquelles vous savez que cela fonctionne. (Certains outils "temporaires" s'avèrent être utilisés dans la production pour les 10 à 20 prochaines années.)

Questions connexes