How to add text on horizontal line with JavaFX BarChart

一曲冷凌霜 提交于 2019-12-12 02:36:54

问题


I use an extended class of BarChart to add vertical lines and text on top of bars. This works fine but I want to display a small text at the top right of the horizontal line.

I tried this without success:

public void addHorizontalValueMarker(Data<X, Y> marker) {
    Objects.requireNonNull(marker, "the marker must not be null");
    if (horizontalMarkers.contains(marker)) return;
    Line line = new Line();
    line.setStroke(Color.RED);        
    marker.setNode(line);
    getPlotChildren().add(line);

    // Adding a label
    Node text = new Text("average");
    nodeMap.put(marker.getNode(), text);
    getPlotChildren().add(text);

    horizontalMarkers.add(marker);
}

@Override
protected void layoutPlotChildren() {
    super.layoutPlotChildren();
    for (Node bar : nodeMap.keySet()) {
        Node text = nodeMap.get(bar);
        text.relocate(bar.getBoundsInParent().getMinX() + bar.getBoundsInParent().getWidth()/2 - text.prefWidth(-1) / 2, bar.getBoundsInParent().getMinY() - 30);
    }
    for (Data<X, Y> horizontalMarker : horizontalMarkers) {
        Line line = (Line) horizontalMarker.getNode();
        line.setStartX(0);
        line.setEndX(getBoundsInLocal().getWidth());
        line.setStartY(getYAxis().getDisplayPosition(horizontalMarker.getYValue()) + 0.5); // 0.5 for crispness
        line.setEndY(line.getStartY());
        line.toFront();
    }

}

What I'm doing wrong ?


回答1:


You need to move the Text after you move the marker, i. e. your code integrated at the required position:

    for (Data<X, Y> horizontalMarker : horizontalMarkers) {
        Line line = (Line) horizontalMarker.getNode();
        line.setStartX(0);
        line.setEndX(getBoundsInLocal().getWidth());
        line.setStartY(getYAxis().getDisplayPosition(horizontalMarker.getYValue()) + 0.5); // 0.5 for crispness
        line.setEndY(line.getStartY());
        line.toFront();

        Node text = nodeMap.get(line);
        text.relocate(line.getBoundsInParent().getMinX() + line.getBoundsInParent().getWidth()/2 - text.prefWidth(-1) / 2, line.getBoundsInParent().getMinY() - 30);
    }

By the way, I suggest creating a dedicated marker class for that which holds the line and the text instead of using a "loose" map.



来源:https://stackoverflow.com/questions/34745600/how-to-add-text-on-horizontal-line-with-javafx-barchart

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!