【问题标题】:How to change the colors of specific bars using Javafx BarChart?如何使用 Javafx BarChart 更改特定条的颜色?
【发布时间】:2017-04-13 15:36:16
【问题描述】:

这是我在做一个项目时一直在寻找的东西。我能找到的最好的方法是如何更改所有条形或根据它们的特定值独立更改。两者都不是合适的解决方案。您可能想要更改单个条形图,每个条形图的数量可能会发生变化。

【问题讨论】:

    标签: java css javafx bar-chart


    【解决方案1】:

    我找到的解决方案最终相当简单,但我没有找到很好的文档并希望将其发布以供将来使用。

    注意:所有这些酒吧都在同一个系列中。类似的修复可能适用于使用多个系列的条形图,但是当每个类别只需要一个条形图时,这对我造成了间距问题。

    以下代码将创建一个条形图,其中包含 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);
    }
    

    }

    我希望这可以帮助任何想要尝试用特定颜色设置条形的人。

    【讨论】:

    • 使用外部 CSS 文件通常比使用 lookup 更好(很多)。
    • 我能问一下为什么吗?如果您有很多格式,我可以看到这是有道理的,但是如果您只使用几行代码,为什么有必要为此创建一个样式表?
    • 查找非常不稳定。例如,在应用 CSS 之前它们不会工作,这通常在第一次布局通过之前不会发生,即直到场景被渲染一次之后。因此,如果您尝试在控制器的初始化方法中执行此操作,例如,它很有可能会因空指针异常而失败。
    猜你喜欢
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2018-08-12
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多