4

在现有的 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 - size 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
4

1 回答 1

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 年内被用于生产。)

于 2013-04-01T23:07:05.840 回答