如何在JavaFX的柱状图上显示柱子值

8

通过这段代码,我能够生成一个包含 10 个柱形图的条形图。现在我想知道如何在每个柱上方显示该柱的值,就像附图所示:enter image description here

以下是代码:

public class BarChartSample 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> bc = 
            new BarChart<String,Number>(xAxis,yAxis);
        bc.setTitle("Country Summary");
        xAxis.setLabel("bars");       
        yAxis.setLabel("Value");

        XYChart.Series series1 = new XYChart.Series();
        series1.setName("...");       

for(int i=0;i<10;i++)
{
   //here i want to change color of bar if value of i is >5 than red if i>8 than blue 
series1.getData().add(new XYChart.Data("Value", i));

}          

}

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

请参考以下链接:http://stackoverflow.com/a/41494789/4469105 - cmtjk
2个回答

19

在每个数据项的node属性的ChangeListener中,您可以调用以下函数将标签添加到栏的顶部:

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
        )
      );
      dataText.setLayoutY(
        Math.round(
          bounds.getMinY() - dataText.prefHeight(-1) * 0.5
        )
      );
    }
  });
}

该代码通过向每个条形节点的父节点添加文本标签,然后根据每次调整条形和文本边界时的条形和文本边界动态定位文本标签来实现。

我为此创建了一个示例解决方案

带图例的标记图表


该代码是使用钻石操作符编写的Java 7代码。您可以将编译器设置为接受Java 7源代码(最低要求)(javac选项-source 7),或者将语句更改为BarChart<String,Number> bc = new BarChart<String,Number>(xAxis,yAxis);,这与Java 6兼容。请注意,即使您正在使用jdk7+,您可能仍在编译低于7的源级别。 - jewelsea
@jewelsea 在StackedBarChart上方添加文本标签怎么样? - Khaled Lela
@khaled 我猜使用StackedBarChart与标准的BarChart相同,如果不是,请提出一个新问题,针对StackedBarCharts解释一下你尝试了什么以及哪些方面没有起作用。 - jewelsea
@jewelsea http://stackoverflow.com/questions/17838490/javafx-adding-a-text-label-on-top-of-stackedbarchart/17838883?noredirect=1#comment26039264_17838883 - Khaled Lela
@jewelsea 我尝试了刷新数据的相同代码。数据刷新后文本似乎仍然存在。我尝试添加文本后将其删除,但没有成功。如果您可以浏览以下链接,我已修改了您的代码并在底部保留了“刷新”按钮。按下它,图表会获得新的值,但旧文本仍然存在。有没有办法在向图表提供新值之前将其删除。 LiNK - https://gist.github.com/abhinayagarwal/9474756 - ItachiUchiha
显示剩余2条评论

0

JFX中没有关于在条形图中显示标签的选项。

您可以扩展条形图类,并覆盖有关内容创建和分配的方法。

您可以观察javafx-ui-charts项目中的图表代码,该项目可从OpenJFX存储库下载。

图表代码并不难理解...

http://hg.openjdk.java.net/openjfx/8/master/rt下载rt存储库

找到javafx-ui-charts项目并打开它。找到条形图的实现。


我已经搜索了很多,但还没有找到运行的代码。你能提供一个例子吗?或者你能帮我修改我的代码吗?感谢你的关注。 - H4SN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接