JavaFX 2.2 饼图颜色未重置

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

不错的hack!我也遇到了这个问题。我认为JavaFX还不够成熟,无法处理所有这些小错误。 - beardedlinuxgeek
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年。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接