JavaFX LineChart Datenpunkte Markierung wird abgeschnitten

godi

Aktives Mitglied
Hallo,
ich habe in JavaFX einen LineChart. Als Datenpunkte habe ich die standardmäßigen Kreise welche für mich auch gut passen.
Die y-Achse sollte von 0 bis 100 sein und die x-Achse von 0 bis einen variablen Wert (im Beispiel vereinfacht fix).

Jetzt habe ich das Problem, dass die Kreise der Datenpunkte an den Rändern abgeschnitten werden.
Ok, dies wollte ich einfach durch das ändern der Range beheben. Dadurch ergibt sich aber das Problem, dass die TicksMarker nicht mehr bei 0 beginnen und auch "krumme" Zahlen bekommen.
Wie kann ich dies beheben?

Mein Ansatz war den Formatter und das Visible flag zu ändern. Führt aber leider nicht zum gewünschten Erfolg.
Gibt es einen anderen Ansatz, damit die Kreise nicht abgeschnitten werden?

Zusatz-Hinweis: Im gesamten Projekt, ist auch noch eine Linie über die ganze y-Höhe am x Punkt 0 eingezeichnet, welche nicht sichtbar ist wenn die X Achse erst bei 0 anfängt.

Java:
package org.example;

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

public class TickMarkExample extends Application {

    @Override
    public void start(Stage primaryStage) {
        // X-Axis
        NumberAxis xAxis = new NumberAxis(-0.1, 12.55, 0.1);
        xAxis.setMinorTickVisible(false);
        xAxis.setAnimated(false); // Disable animation for easier access to TickMarks

        // Set new formatter for the x-axis to show only labels at 0, 0.1, ...
        xAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(xAxis) {
            @Override
            public String toString(Number object) {
                // Round the value to one decimal place
                var val = Math.round(object.doubleValue() * 10.0) / 10.0;
                // Show labels only for values greater than or equal to 0
                if (val >= 0.0) {
                    return String.valueOf(val);
                }
                return "";
            }
        });

        // Y-Axis
        NumberAxis yAxis = new NumberAxis(-2, 102, 5);
        yAxis.setLabel("Y-Axis");

        // Create LineChart
        LineChart<Number, Number> lineChart = new LineChart<>(xAxis, yAxis);
        lineChart.setTitle("Line Chart Example");

        // Data
        XYChart.Series<Number, Number> series = new XYChart.Series<>();
        series.getData().add(new XYChart.Data<>(0, 0));
        series.getData().add(new XYChart.Data<>(1, 10));
        series.getData().add(new XYChart.Data<>(2, 100));
        series.getData().add(new XYChart.Data<>(3, 0));
        series.getData().add(new XYChart.Data<>(12.5, 100));

        lineChart.getData().add(series);

        // Create scene
        Scene scene = new Scene(lineChart, 600, 400);

        // Configure stage
        primaryStage.setTitle("JavaFX LineChart Example");
        primaryStage.setScene(scene);
        primaryStage.show();

        // Access the TickMarks of the X-Axis and change the visible flag
        for (int i = 0; i < xAxis.getTickMarks().size(); i++) {
            javafx.scene.chart.NumberAxis.TickMark<Number> tickMark = xAxis.getTickMarks().get(i);
            double tickValue = tickMark.getValue().doubleValue();

            // Set the visible flag to show the TickMark at 0 and hide for negative values
            tickMark.setTextVisible(tickValue >= 0);
        }
    }

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

Ähnliche Java Themen

Neue Themen


Oben