2017-04-13 108 views
0

這是我一直在尋找一個項目時尋找的東西。我能找到的最好的是如何改變所有的酒吧或根據他們的具體價值獨立。都不覺得是一個適當的解決方案。您可能需要更改單個小節,每個小節的數量可能會發生變化。如何使用Javafx BarChart更改特定欄的顏色?

回答

0

我發現的解決方案非常簡單,但我沒有找到非常好的文檔,並且希望將其發佈以供將來使用。

注意:所有這些酒吧是在同一系列。類似的修復可能適用於使用多個系列的條形圖,但是當每個類別只需要一個條形時,這會對我造成間距問題。

以下代碼將創建一個條形圖,其中包含4個類別來跟蹤並將它們添加到圖表中。

public class BarChartExample extends Application { 

final static String project = "Project - 20%"; 
final static String quiz = "Quiz - 10%"; 
final static String midterm = "Midterm - 30%"; 
final static String finalexam = "Final - 40%"; 

@Override 
public void start(Stage primaryStage) throws Exception{ 
    primaryStage.setTitle("Change Bar Color Example"); 
    final CategoryAxis xAxis = new CategoryAxis(); 
    final NumberAxis yAxis = new NumberAxis(); 
    final BarChart<String,Number> barChart = new BarChart<String,Number>(xAxis,yAxis); 
    xAxis.setLabel("Assignment Type"); 
    yAxis.setLabel("Percentage"); 

    XYChart.Series series = new XYChart.Series(); 
    series.getData().add(new XYChart.Data(project, 20)); 
    series.getData().add(new XYChart.Data(quiz, 10)); 
    series.getData().add(new XYChart.Data(midterm, 30)); 
    series.getData().add(new XYChart.Data(finalexam, 40)); 
    barChart.getData().add(series); 

接下來是與本文相關的部分。這是發生顏色變化的地方。條被認爲是節點,所以你可以設置每個條等於一個節點變量,並使用CSS來改變它的風格。

Node n = barChart.lookup(".data0.chart-bar"); 
    n.setStyle("-fx-bar-fill: red"); 
    n = barChart.lookup(".data1.chart-bar"); 
    n.setStyle("-fx-bar-fill: blue"); 
    n = barChart.lookup(".data2.chart-bar"); 
    n.setStyle("-fx-bar-fill: green"); 
    n = barChart.lookup(".data3.chart-bar"); 
    n.setStyle("-fx-bar-fill: orange"); 

其餘的只是擺脫了傳說(因爲在這種情況下,它是不必要的),並填寫其餘必要的代碼,使其運行。

barChart.setLegendVisible(false); 
    VBox vbox = new VBox(barChart); 

    Scene scene = new Scene(vbox); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 

} 

public static void main(String[] args) { 
Application.launch(args); 
} 

}

我希望這可以幫助任何人尋找到想要設置特定的顏色吧。

+0

使用外部CSS文件進行此操作通常(非常)更好,而不是使用「lookup」。 –

+0

我可以問爲什麼?如果你有很多格式化的話,我可以看到這是合理的,但如果你只是使用幾行代碼,爲什麼有必要爲此創建一個樣式表? – Crislips

+0

查找非常不穩定。例如,它們在應用CSS之前不會工作,直到第一次佈局通過時纔會發生這種情況,即直到場景渲染一次之後。因此,例如,如果您嘗試在控制器的初始化方法中執行此操作,則很可能會因空指針異常而失敗。 –