javafx 2.2饼图颜色未重置

时间:2012-08-25 16:59:22

标签: colors javafx-2 pie-chart

在现有的PieChart上设置新数据时,我注意到颜色不一样。 (它们围绕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);
    }
}

保留颜色排序的黑客是在清除之前添加8个大小的mod 8个项目,但我确信有一个更简单的方法(或者我添加错误的数据)

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

1 个答案:

答案 0 :(得分:0)

目前无法重置颜色。用于颜色索引的字段在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 );
}

不要使用它。

如果你必须:

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