【问题标题】:Adding an Image Inside Each Bar on a BarChart JavaFX在 BarChart JavaFX 上的每个条形图内添加图像
【发布时间】:2020-09-08 08:30:28
【问题描述】:

我知道如何在 BarChart 的每个条形顶部或内部添加文本

private void displayLabelForData(XYChart.Data<String, Number> data) {
    final Node node = data.getNode();
    final Text dataText = new Text(data.getYValue() + "");
    node.parentProperty().addListener(new ChangeListener<Parent>() {
        @Override 
        public void changed(ObservableValue<? extends Parent> ov, Parent oldParent, Parent parent) {
            Group parentGroup = (Group) parent;
            parentGroup.getChildren().add(dataText);
        }
    });

    node.boundsInParentProperty().addListener(new ChangeListener<Bounds>() {

        @Override 
        public void changed(ObservableValue<? extends Bounds> ov, Bounds oldBounds, Bounds bounds) {
            dataText.setLayoutX(Math.round(bounds.getMinX() + bounds.getWidth() / 2 - dataText.prefWidth(-1) / 2));

            //on top of each bar
            dataText.setLayoutY(Math.round(bounds.getMinY() - dataText.prefHeight(-1) * 0.5));
        }
    });
}

或在每个栏内

dataText.setLayoutY(Math.round(bounds.getMinY() - dataText.prefHeight(-1) * -0.5));

我也知道如何使用 JavaFX 加载图像并将图像显示到 ImageView。

Image myImage = new Image("location.png");
ImageView viewImage = new ImageView();
viewImage.setImage(myImage);

现在假设我在 barChart 中有 5 个条形图,并且有 5 个图像。

现在我想知道是否可以在条形图的每个条形内添加每个图像。有什么我不知道的方法吗?

谢谢!

【问题讨论】:

  • 不是同样的事情吗?
  • 另外,将节点添加到条形图的一般机制不是很健壮(假设每个数据点的节点都包含在一个组中,父节点是在数据点构造函数之后的某个时间设置的完成等)。 stackoverflow.com/questions/38871202/… 显示了一种更 API 友好的折线图方法:我建议改用该方法。
  • 好的,它会应用于条形图吗?
  • 您可能需要稍微调整一下,但总体思路应该可行。
  • 你又想让别人为你做你的工作,又找到了一个

标签: java javafx bar-chart


【解决方案1】:

以下是如何将图像添加到BarChart 的数据的示例:

import javafx.application.Application;
import javafx.application.Platform;
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.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class BarChartExample extends Application {

    @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> barChart = new BarChart<>(xAxis, yAxis);
        barChart.setTitle("Country Summary");
        xAxis.setLabel("Country");
        yAxis.setLabel("Value");

        XYChart.Series series = new XYChart.Series();
        series.setName("2003");
        series.getData().addAll(new XYChart.Data("Brazil", 20148.82),
                new XYChart.Data("France", 10000),
                new XYChart.Data("Italy", 35407.15),
                new XYChart.Data("USA", 17000));


        Platform.runLater(() -> {
            series.getData().forEach(seriesData -> {
                XYChart.Data data = (XYChart.Data) seriesData;
                StackPane node = (StackPane) data.getNode();
                String name = (String) data.getXValue();
                ImageView imageView = getImageForCountry(name);
                imageView.fitWidthProperty().bind(node.widthProperty().multiply(.5));
                imageView.setPreserveRatio(true);
                node.getChildren().add(imageView);
            });
        });
        barChart.getData().addAll(series);
        Scene scene  = new Scene(barChart, 800, 600);
        stage.setScene(scene);
        stage.show();
    }

    private ImageView getImageForCountry(String countryName) {
        URL url = getClass().getResource(countryName.toLowerCase() + ".png");
        Image image = new Image(url);
        return new ImageView(image);
    }

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

输出:

【讨论】:

  • 这也可以使用 css 完成,参见Oracle chart styling tutorial:示例 38-14 将图像添加到栏背景
  • @jewelsea 你是对的。也许我应该在我的答案中添加这种方式。但是我们怎样才能使图像动态呢?我的意思是,如果France 并不总是第二个栏怎么办?
  • 从一个动态构建的字符串构造 css 样式表,该字符串是一个 data uri 定义每个类别在轴上的位置的图像。
  • @jewelsea 谢谢。我不知道这个功能。另一个问题是,当使用教程中的 CSS 时,图像会重复填充栏的高度。
猜你喜欢
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 2020-09-02
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多