【问题标题】:Setting LineChart symbol via code without css in JavaFX在JavaFX中通过没有css的代码设置LineChart符号
【发布时间】:2021-10-27 10:59:38
【问题描述】:

此问题基于thisthis

用户可以选择自定义颜色,之后我需要以这种颜色显示折线图。这些行确实按照第二个链接中的描述工作:

String rgb = String.format("%d, %d, %d",
        (int) (user.getColor().getRed() * 255),
        (int) (user.getColor().getGreen() * 255),
        (int) (user.getColor().getBlue() * 255));
series.nodeProperty().get().setStyle("-fx-stroke: rgba(" + rgb + ", 1);");

我无法更改用户图表的符号。使用 css 你可以这样做:

.default-color0.chart-line-symbol { -fx-background-color: #e9967a, white; }
.default-color1.chart-line-symbol { -fx-background-color: #f0e68c, white; }
.default-color2.chart-line-symbol { -fx-background-color: #dda0dd, white; }

我不能这样做,因为用户可以选择任何可能的颜色。有解决办法吗?


我试过这个,但这会抛出一个NullPointerException

chart.lookup(".default-color0.chart-line-symbol")
     .setStyle("-fx-background-color: rgba(" + rgb + ", 1), white;");

添加Platform.runLater(() -> chart.lo....) 会删除NullPointerException(我不明白为什么),但只会将一些点变成正确的颜色,而不是图例。

【问题讨论】:

  • CSS 查找仅在应用了 CSS 之后才起作用,默认情况下发生在第一个布局阶段;这解释了为什么您会得到一个空指针异常,该异常是通过使用 Platform.runLater() 删除的。一种更稳健的方法是在执行查找之前在场景中调用applyCSS()。但我的答案中的解决方案完全避免了查找。

标签: java css javafx


【解决方案1】:

定义一系列“查找颜色”,然后您可以通过编程方式对其进行更改。

在外部 CSS 文件中,将这些设置为一些默认值,并根据它们定义背景颜色:

.line-chart {
    symbol-color0: #e9967a ;
    symbol-color1: #f0e68c ;
    symbol-color2: #dda0dd ;
    /* ... */
}

.default-color0.chart-line-symbol { -fx-background-color: symbol-color0, white; }
.default-color1.chart-line-symbol { -fx-background-color: symbol-color1, white; }
.default-color2.chart-line-symbol { -fx-background-color: symbol-color2, white; }

然后在您的 Java 代码中,您可以将它们重新定义为任意颜色:

Color[] colors = getUserDefinedColors();

StringBuilder style = new StringBuilder();
for (int i = 0 ; i < colors.length ; i++) {
    style.append("symbol-color")
         .append(i)
         .append(": ")
         .append(convertToWebString(colors[i]))
         .append("; ");
}
myLineChart.setStyle(style.toString());

类似的东西

private String convertToWebString(Color c) {
    int r = (int)(255*c.getRed());
    int g = (int)(255*c.getGreen());
    int b = (int)(255*c.getBlue());
    return String.format("#%02x%02x%02x", r, g, b);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2016-02-27
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2020-09-29
    相关资源
    最近更新 更多