Colors javafx 2.2饼图颜色未重置

Colors javafx 2.2饼图颜色未重置,colors,javafx-2,pie-chart,Colors,Javafx 2,Pie Chart,当在现有图表上设置新数据时,我注意到颜色不一样。 (它们在css颜色列表中循环,就像某些内部计数器没有被重置一样) 如何在颜色0处重新开始颜色,而不每次重新创建图表 例如: import javafx.application.Application; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Group; import javafx.

当在现有图表上设置新数据时,我注意到颜色不一样。 (它们在css颜色列表中循环,就像某些内部计数器没有被重置一样)

如何在颜色0处重新开始颜色,而不每次重新创建图表

例如:

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);
    }
}
导入javafx.application.application;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.chart.PieChart;
导入javafx.stage.stage;
公共类ChartAdvancedPie扩展了应用程序{
PieChart pc=新PieChart();
私有void init(阶段primaryStage){
组根=新组();
primaryStage.setScene(新场景(根));
root.getChildren().add(pc);
pc.setAnimated(假);
SetupData();
SetupData();//注释掉此项仅查看第一种颜色
}
受保护的void SetupData(){
ObservableList data=FXCollections.observableArrayList();
添加(新的PieChart.data(“切片”,1));
添加(新的PieChart.data(“切片”,2));
添加(新的PieChart.data(“切片”,3));
pc.getData().clear();
pc.setData(数据);
}
@覆盖公共无效开始(阶段primaryStage)引发异常{
初始阶段;
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}
保留颜色顺序的一种方法是在清除之前再添加8号mod 8项目,但我相信有一种更简单的方法(或者我添加了错误的数据)

int rem=8-(pieChartData.size()%8);
对于(inti=0;i
目前无法重置颜色。用于颜色索引的字段在PieChart中声明为私有,并且没有正式的修改方法

但是,如果环境允许,可以通过反射来修复它。修改
SetupData
方法如下:

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 );
}
protectedvoid SetupData(){
ObservableList data=FXCollections.observableArrayList();
添加(新的PieChart.data(“切片”,1));
添加(新的PieChart.data(“切片”,2));
添加(新的PieChart.data(“切片”,3));
//pc.getData().clear();
试一试{
Class cls=PieChart.Class;
字段f=cls.getDeclaredField(“defaultColorIndex”);
f、 setAccessible(true);
f、 setInt(pc,0);
}捕获(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e){
e、 printStackTrace();
}
pc.setData(数据);
}
不要用它

如果必须:


f.setAccessible(true)
允许设置私有字段。这可能会失败,在配置合理的设置中也会失败。如果您的应用程序是一个小型桌面工具,它可能会工作。此外,在执行此操作之前,您可能希望检查java版本,并仅为您知道其适用的版本启用代码。(一些“临时”工具将在未来10至20年内用于生产。)

Nice hack!我有问题。我认为JavaFX还不够成熟,无法处理所有这些小错误。
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 );
}