2012-08-25 101 views
4

在現有PieChart上設置新數據時,我注意到顏色不一樣。 (它們圍繞css顏色列表循環,就好像某些內部計數器未被重置)javafx 2.2餅圖顏色不重置

如何在顏色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 
+0

尼斯破解!我有這個問題。我認爲JavaFX還不夠成熟,無法處理所有這些小錯誤。 – beardedlinuxgeek

回答

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年內用於生產。)