2017-04-13 110 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之前不会工作,直到第一次布局通过时才会发生这种情况,即直到场景渲染一次之后。因此,例如,如果您尝试在控制器的初始化方法中执行此操作,则很可能会因空指针异常而失败。 –