【问题标题】:javafx 2.2 pie chart colors not resettingjavafx 2.2饼图颜色未重置
【发布时间】:2012-08-25 16:59:21
【问题描述】:

在现有饼图上设置新数据时,我注意到颜色不一样。 (它们在 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

【问题讨论】:

  • 不错的技巧!我有问题。我认为 JavaFX 还不够成熟,无法处理所有这些小错误。

标签: colors javafx-2 pie-chart


【解决方案1】:

目前无法重置颜色。用于颜色索引的字段在 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 年内被用于生产。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多