如何在线图区域内显示图例

时间:2015-05-18 11:00:59

标签: java javafx javafx-8

我想在折线图区域内显示图例。默认情况下,图表区域外的图例显示基于Side.RIGHT,Side.LEFT等参数已传递给chart.setLegendSide(Side),如下例所示: -

import javafx.application.Application;
import javafx.geometry.Side;
import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;


public class LineChartSample extends Application {

    @Override public void start(Stage stage) {
        stage.setTitle("Line Chart Sample");
        final CategoryAxis xAxis = new CategoryAxis();
        final NumberAxis yAxis = new NumberAxis();
        xAxis.setLabel("Month");
        final LineChart<String,Number> lineChart = 
                new LineChart<String,Number>(xAxis,yAxis);

        lineChart.setTitle("Graph Example");

        lineChart.setLegendSide(Side.RIGHT);

        XYChart.Series series1 = new XYChart.Series();
        series1.setName("Legend 1");
        series1.getData().add(new XYChart.Data("Jan", 23));
        series1.getData().add(new XYChart.Data("Feb", 14));
        series1.getData().add(new XYChart.Data("Mar", 15));
        series1.getData().add(new XYChart.Data("Apr", 24));
        series1.getData().add(new XYChart.Data("May", 34));
        series1.getData().add(new XYChart.Data("Jun", 36));


        XYChart.Series series2 = new XYChart.Series();
        series2.setName("Legend 2");
        series2.getData().add(new XYChart.Data("Jul", 55));
        series2.getData().add(new XYChart.Data("Aug", 54));
        series2.getData().add(new XYChart.Data("Sep", 48));
        series2.getData().add(new XYChart.Data("Oct", 27));
        series2.getData().add(new XYChart.Data("Nov", 37));
        series2.getData().add(new XYChart.Data("Dec", 29));
        Scene scene  = new Scene(lineChart,800,600);       
        lineChart.getData().addAll(series1, series2);

        stage.setScene(scene);
        stage.show();
    }

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

我找不到在图表区域内显示图例的方法。最多我会有2-3个传说并使用java 8。

谢谢

1 个答案:

答案 0 :(得分:2)

我认为没有任何干净的方法可以做到这一点。我拿出了setLegendSide并在stage.show()

之后添加了此内容
    for (Node n : lineChart.lookupAll(".chart-legend")) {
        n.setTranslateY(-200);
    }

在场景显示后,您可以查找&#39;场景中的节点。我找到了传说(按照它的css名称)并将其移动了200。

您还可以在css文件中翻译图例

.chart-legend{
     -fx-translate-y: -200;
}

只需将css文件添加到您的场景中(如果它在同一个包中,就像这样)。

scene.getStylesheets().add(this.getClass().getResource("css.css").toExternalForm());

这仍然会在图表下留下空间,因此它并不完美。我注意到你可以添加这个css来给chart-content更多的空间

.chart .chart-content{
    -fx-padding: 5 5 -25 5;
}