Swing Graph zeichnen lassen

Bitte aktiviere JavaScript!
Hallo,
ich möchte eine Parabel in einem Koordinatensystem zeichnen lassen.
Ich bin mir nicht sicher welche die beste Methode dafür ist.
Ist dies über JFreeChart?

Danke:)
 
Für das Plotten von einer Funktion braucht man jetzt keine extra Bibliothek.

Hier mal ein JavaFX Beispiel:
Java:
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;

import java.util.function.Function;

public class GraphTest extends Application {
    @Override
    public void start(Stage stage) {
        Function<Double, Double> f = (x) -> Math.pow(x, 2);

        LineChart<Number, Number> lineChart = new LineChart<>(new NumberAxis(), new NumberAxis());
        lineChart.setCreateSymbols(false);

        double stepSize = 0.1;
        double minX = -5, maxX = 5;

        XYChart.Series<Number, Number> series = new XYChart.Series<>();
        for (double x = minX; x <= maxX; x += stepSize) {
            series.getData().add(new XYChart.Data<>(x, f.apply(x)));
        }
        lineChart.getData().add(series);

        Scene scene = new Scene(lineChart, 800, 800);
        stage.setScene(scene);
        stage.show();
    }
}
Mit Swing wird das vermutlich ähnlich schnell gehen.
 
Für das Plotten von einer Funktion braucht man jetzt keine extra Bibliothek.

Hier mal ein JavaFX Beispiel:
Java:
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;

import java.util.function.Function;

public class GraphTest extends Application {
    @Override
    public void start(Stage stage) {
        Function<Double, Double> f = (x) -> Math.pow(x, 2);

        LineChart<Number, Number> lineChart = new LineChart<>(new NumberAxis(), new NumberAxis());
        lineChart.setCreateSymbols(false);

        double stepSize = 0.1;
        double minX = -5, maxX = 5;

        XYChart.Series<Number, Number> series = new XYChart.Series<>();
        for (double x = minX; x <= maxX; x += stepSize) {
            series.getData().add(new XYChart.Data<>(x, f.apply(x)));
        }
        lineChart.getData().add(series);

        Scene scene = new Scene(lineChart, 800, 800);
        stage.setScene(scene);
        stage.show();
    }
}
Mit Swing wird das vermutlich ähnlich schnell gehen.
Danke für deine Hilfe:)
Als Anmerkung, ich arbeite mit Swing und nicht JavaFX.

Ist es hierbei aber auch möglich, dass ich das Koordinatensystem nicht vorgebe, sondern aus meinen Daten erzeuge lasse.
Sprich: Meine Werte rechne ich davor aus und speicher diese in einer ArrayList. Kann ich dann nun z.b. auch die Grenzen für das Koordinatensystem daraus entnehmen(z.B min/max Werte).
Ich möchte ja dann mit meinen Werten aus der ArrayList meine Funktion zeichnen lassen. Das sollte ebenfalls möglich sein.
 
Plotten kannste das dann in Swing vermutlich echt am besten mit JFreeChart.
Java:
package handler;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.DefaultXYDataset;

import javax.swing.*;
import java.util.List;
import java.util.function.Function;
import java.util.stream.IntStream;

public class GraphTest extends JPanel {

    static Function<Double, Double> f = (x) -> Math.pow(x, 2);

    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame();

            frame.setSize(800, 800);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);

            double[] xValues = IntStream.range(-50, 50).mapToDouble(i -> (double) i / 10).toArray();
            double[] yValues = Arrays.stream(xValues).map(x -> f.apply(x)).toArray();

            DefaultXYDataset ds = new DefaultXYDataset();
            ds.addSeries("Graph 1", new double[][]{xValues, yValues});

            JFreeChart chart = ChartFactory.createXYLineChart("Test-Graph",
                    "x", "y", ds, PlotOrientation.VERTICAL, true, true,
                    false);

            ChartPanel cp = new ChartPanel(chart);

            frame.getContentPane().add(cp);
        });

    }

}
Wenn du deine x- und y-Werte reinwirfst, wird das Koordinatensystem automatisch passend groß gewählt, du solltest nur auf die Sortierung der Werte achten.
 
Zuletzt bearbeitet:
Plotten kannste das dann in Swing vermutlich echt am besten mit JFreeChart.
Java:
package handler;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.DefaultXYDataset;

import javax.swing.*;
import java.util.List;
import java.util.function.Function;
import java.util.stream.IntStream;

public class GraphTest extends JPanel {

    static Function<Double, Double> f = (x) -> Math.pow(x, 2);

    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame();

            frame.setSize(800, 800);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);

            double[] xValues = IntStream.range(-50, 50).mapToDouble(i -> (double) i / 10).toArray();
            double[] yValues = Arrays.stream(xValues).map(x -> f.apply(x)).toArray();

            DefaultXYDataset ds = new DefaultXYDataset();
            ds.addSeries("Graph 1", new double[][]{xValues, yValues});

            JFreeChart chart = ChartFactory.createXYLineChart("Test-Graph",
                    "x", "y", ds, PlotOrientation.VERTICAL, true, true,
                    false);

            ChartPanel cp = new ChartPanel(chart);

            frame.getContentPane().add(cp);
        });

    }

}
Wenn du deine x- und y-Werte reinwirfst, wird das Koordinatensystem automatisch passend groß gewählt, du solltest nur auf die Sortierung der Werte achten.
Meine Werte sind eigentlich schon von groß nach klein in der ArrayListe. Zumindest werden sie so rein gespeichert.
Kennst du zufällig eine gute Seite wo das mit JFreeChart (in Verbindung mit ArrayListe) erklärt ist. Ich habe da nicht wirklich etwas sinnvolles gefunden.
 
Wie sieht deine Liste mit den Werten denn aus? Von welchem Typ ist die?
Du musst deine Liste doch nur in zwei Arrays aufteilen mit den x- und y-Werten. Das hat jetzt nicht wirklich was mit JFreeChart zu tun, das sind einfach Java-Basics.
 
Meine Werte sind eigentlich schon von groß nach klein in der ArrayListe.
Die Frage ist, wie der Zusammenhang zwischen den x- und y-Koordinaten beschrieben ist. Du kannst ja eine Liste nur mit z. B. y-Koordinaten haben, dann könnte die x-Koordinate über den Listen-Index hergestellt werden (1. Eintrag in der Liste entspricht der x-Koordinate -5, 2. Eintrag der x-Koordinate -4 usw.) Umgekehrt können sich in der Liste auch Objekte befinden, die bereits Koordinatenpaare enthalten.
 
Ohne Libraries (und dazu zähle ich auch FX...) geht das mit curve fitting, AWT's Strokes und etwas "Handarbeit". Aber ich befürchte, das übersteigt deine Erfahrungen. :rolleyes:
 
Hmm, Gymi? Ihr sollt natürlich auch "dahin gebracht werden", Lösungen selbständig, ohne fremde Hilfe, aber mit "teilweisen" Vorgaben des Lehrkörpers zu erarbeiten und zu präsentieren.
Welche Themen habt ihr (letztlich(/last, but not least)) denn so behandelt...
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben