chart.getData().addListener(new ListChangeListener<Series<String, Number>>() {
@Override
public void onChanged(
final javafx.collections.ListChangeListener.Change<? extends Series<String, Number>> c) {
while (c.next()) {
for (final Series s : c.getAddedSubList()) {
if ("booking".equalsIgnoreCase(s.getName())) {
if (s.getNode() != null) {
s.getNode().getStyleClass().add(".source-background-booking");
}
} else if ("airbnb".equalsIgnoreCase(s.getName())) {
if (s.getNode() != null) {
s.getNode().getStyleClass().add(".source-background-airbnb");
}
}
}
}
}
});
chart.getData().addListener(new ListChangeListener<Series<String, Number>>() {
@Override
public void onChanged(
final javafx.collections.ListChangeListener.Change<? extends Series<String, Number>> c) {
while (c.next()) {
System.err.println("Series " + c.getAddedSubList() + " kommt rein..");
for (final Series<String, Number> s : c.getAddedSubList()) {
s.nodeProperty().addListener(new ChangeListener<Node>() {
@Override
public void changed(final ObservableValue<? extends Node> observable, final Node oldValue,
final Node newValue) {
System.err.println("Already good");
if ("booking".equalsIgnoreCase(s.getName())) {
newValue.getStyleClass().add(".source-background-booking");
System.err.println("Seems to work..");
} else if ("airbnb".equalsIgnoreCase(s.getName())) {
newValue.getStyleClass().add(".source-background-airbnb");
System.err.println("Seems to work..");
}
}
});
}
}
}
});
不幸的是,这个回调似乎从来没有被调用。
试试这个:
import com.sun.javafx.charts.Legend;
import com.sun.javafx.charts.Legend.LegendItem;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.control.Label;
import javafx.stage.Stage;
public class BarChartSample extends Application {
final static String austria = "Austria";
final static String brazil = "Brazil";
final static String france = "France";
final static String italy = "Italy";
final static String usa = "USA";
@Override public void start(Stage stage) {
stage.setTitle("Bar Chart Sample");
final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis yAxis = new NumberAxis();
final BarChart<String,Number> bc = new BarChart(xAxis,yAxis);
bc.setTitle("Country Summary");
xAxis.setLabel("Country");
yAxis.setLabel("Value");
XYChart.Series series1 = new XYChart.Series();
series1.setName("2003");
series1.getData().add(new XYChart.Data(austria, 25601.34));
series1.getData().add(new XYChart.Data(brazil, 20148.82));
series1.getData().add(new XYChart.Data(france, 10000));
series1.getData().add(new XYChart.Data(italy, 35407.15));
series1.getData().add(new XYChart.Data(usa, 12000));
XYChart.Series series2 = new XYChart.Series();
series2.setName("2004");
series2.getData().add(new XYChart.Data(austria, 57401.85));
series2.getData().add(new XYChart.Data(brazil, 41941.19));
series2.getData().add(new XYChart.Data(france, 45263.37));
series2.getData().add(new XYChart.Data(italy, 117320.16));
series2.getData().add(new XYChart.Data(usa, 14845.27));
XYChart.Series series3 = new XYChart.Series();
series3.setName("2005");
series3.getData().add(new XYChart.Data(austria, 45000.65));
series3.getData().add(new XYChart.Data(brazil, 44835.76));
series3.getData().add(new XYChart.Data(france, 18722.18));
series3.getData().add(new XYChart.Data(italy, 17557.31));
series3.getData().add(new XYChart.Data(usa, 92633.68));
Scene scene = new Scene(bc,800,600);
bc.getData().addAll(series1, series2, series3);
stage.setScene(scene);
stage.show();
//Used to change series color.
for (XYChart.Series<String, Number> series : bc.getData()) {
if(series.getName().equals("2003"))
{
System.out.println("Series name: " + series.getName());
for(Data data : series.getData())
{
data.getNode().setStyle("-fx-bar-fill: firebrick;");
}
}
}
//Used to change legend color
for(Node n : bc.getChildrenUnmodifiable())
{
if(n instanceof Legend)
{
System.out.println(((Legend)n).getItems());
for(LegendItem items : ((Legend)n).getItems())
{
System.out.println("Legend item text: " + items.getText());
if(items.getText().equals("2003"))
{
items.getSymbol().setStyle("-fx-bar-fill: firebrick;");
}
}
}
}
}
public static void main(String[] args) {
launch(args);
}
}
对于Java10及以上版本,将用于更改图例颜色的代码替换为下面的代码。未在Java9上测试
//Used to change legend color
for(Node node : bc.lookupAll("Label.chart-legend-item"))
{
Label tempLabel = (Label)node;
if(tempLabel.getText().equals("2003"))
{
tempLabel.getGraphic().setStyle("-fx-bar-fill: firebrick;");
}
}
这个应用程序将2003年系列的颜色改为耐火砖。for循环是您应该关注的部分。
我知道我可以使用以下代码设置图例项目的设置颜色:
这是我生成10条不同颜色条的代码。我想分别添加图例,但它只显示黄色图例。我可以更改其颜色,但我想要3个图例。 我认为它只显示一种颜色,因为只有一个系列。是否可以为单个系列添加多个图例? 或者如果我可以将此图像作为图例添加到图表的左中 我需要如何在条形图中显示图像,或者如何为单个系列条形图创建3个不同的标签
问题内容: 我是JFreeChart的新手,我正在尝试看看什么动作可以做什么。 在我的图表中,我只有一个系列,并且我希望-根据值设置-为柱形设置其他颜色。例如 : 这是我到达的地方,我被困在这里,真的不知道要去哪里。我在文档中看到Paint是一个接口,但是没有实现此接口的类都没有提供setXXX()方法。所以,我的两个问题是: 如何为单个条形设置颜色? 如何将其应用于图表? 问题答案: 您需要创建
问题内容: 如何在JavaFX中更改条形的颜色? 我找不到通过CSS 方法更改颜色的方法。 问题答案: 您可以使用css设置条的颜色 使用setStyle方法: 在Node类中使用 lookupAll方法, 查找与给定CSS选择器匹配的所有节点,包括该节点和所有子节点。如果找不到匹配项,则返回一个空的不可修改的集合。该集合明确无序。 代码:
我希望这个图中的条形图有我自己选择的不同颜色。我不想使用随机的颜色为酒吧(或一组酒吧)。
假设我有三个数据集: 我可以分散绘制这个: 10套怎么做得到? 我搜索了这个,可以找到任何关于我所问问题的参考资料。 编辑:澄清(希望)我的问题 如果我多次调用散点,我只能在每个散点上设置相同的颜色。此外,我知道我可以手动设置颜色阵列,但我相信有更好的方法来做到这一点。我的问题是,“我如何自动分散绘制我的几个数据集,每个数据集都有不同的颜色。 如果有帮助,我可以很容易地为每个数据集分配一个唯一的数