当前位置: 首页 > 面试题库 >

JavaFX StackedBarChart自动在不同系列上重复使用相同的颜色:如何避免呢?

公冶谦
2023-03-14
问题内容

在JavaFx中,我使用以下代码创建一个StackedBarChart:

        String[] ACTIVITIES = new String[10]{ ... };// there are 10 activity names here
        for (String activityName : ACTIVITIES) { 
            Series<String, Number> activitySerie = new Series<String, Number>();
            activitySerie.setName(activityName);
            stackedBarChart.getData().add(activitySerie);

        }

结果是从1到8的系列具有不同的颜色。9-10系列与1-2系列具有相同的颜色。我试图在style.css文件中为条形图指定默认颜色,但似乎9-10系列实际上使用了颜色0和1。我认为这是一个错误。有谁知道解决方法?


问题答案:

颜色在8个系列之后被回收(原因是必须对定义的颜色数量进行一定的硬编码限制:JavaFX
CSS语法只是没有提供足够的语法来计算任意值,而对于超出该范围的系列限制需要定义的一些颜色)。

要为8号以后的系列创建颜色,您需要做两件事:在表示其他系列的节点上设置样式类,并为CSS中的样式设置样式。

SSCCE:

import java.util.Random;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.StackedBarChart;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class StackedBarChartExample extends Application {

    @Override
    public void start(Stage primaryStage) {
        StackedBarChart<String, Number> chart = new StackedBarChart<>(new CategoryAxis(), new NumberAxis());

        Random rng = new Random();

        int numSeries = 10 ;
        int defaultColorsDefined = 8 ;


        for (int i = 0; i < numSeries; i++) {
            Series<String, Number> series = new Series<>();
            Data<String, Number> untreated = new Data<>("Untreated", rng.nextDouble());
            series.getData().add(untreated);
            Data<String, Number> treated = new Data<>("Treated", rng.nextDouble());
            series.getData().add(treated);
            series.setName("Series "+i);

            chart.getData().add(series);

            // add style classes for additional series beyond the default support:
            // Note this must be done after adding the series to the chart...
            if (i >= defaultColorsDefined) {
                untreated.getNode().getStyleClass().add("default-color"+i);
                treated.getNode().getStyleClass().add("default-color"+i);
            }
        }

        BorderPane root = new BorderPane(chart);
        Scene scene = new Scene(root);
        scene.getStylesheets().add("stacked-bar-chart.css");
        primaryStage.setScene(scene);
        primaryStage.show();


    }

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

然后只需按常规方法在CSS中定义一些颜色即可:

.default-color8.chart-bar {
    -fx-bar-fill: black ;
}
.default-color9.chart-bar {
    -fx-bar-fill: green ;
}


 类似资料:
  • 我有一个图标svg喜欢: 它显示很好,但我想在某些情况下改变颜色(如悬停或选择) 我用过: 它不会改变颜色。任何帮助都将不胜感激。

  • 我有一个从XML映射的类。为了简单起见,让我们想象这个类是这样的: 现在,现有的代码中充满了像这样的方法: …等等。你肯定有这个想法。 我需要包含一个新的方法来从employee返回一个新的属性,但是由于我觉得这对mantain来说是可怕的,所以我拒绝在那里添加一个新的方法。我正在考虑使用action模式,以某种方式避免至少重复againg和for循环,但我不得不说,我找不到一个聪明的解决方案。

  • 问题内容: 在我试图基于y值为XY折线图/曲线的不同区域着色。我重写的 ,但我不知道它是如何处理 之间的线色小号,因为它只是让了(整数值)。 问题答案: 看起来线之间的着色的处理是在 线条颜色似乎基于先前的点 对您的修改使用渐变填充来混合线条颜色。 我已删除,因为我无权访问该类/方法。您可能需要修改以考虑 点之间的距离/渐变。

  • 如何将两个熊猫DataFrames合并到两个具有不同名称的列上,并保留其中一个列? 这提供了一个像这样的数据帧 但是很明显,我正在合并和,所以它们是相同的。我想让它看起来像这样。有什么干净的方法可以做到这一点吗? 我唯一能想到的方法是在合并之前将列重新命名为相同的列,或者在合并之后删除其中一个列。如果熊猫自动掉落其中一只,我会很高兴,或者我可以做类似的事情

  • 我想用不同的列值执行相同的SQL查询,即:我有一个如下表: 从上表中,我想获取员工组的和。请建议我如何在不执行多次的情况下进行查询以获取上述数据。

  • 我有一个双轴图,由折线图和柱状图组成,一个折线图中可能有多条线,一个柱状图中可能有多个柱。 在由折线图和柱状图组成的双轴图中,如何自由的定义每一个柱和折线的颜色等信息?