Ein chart zeichnen

Hallo, ich wollte mal einen chart zeichnen, und hab euch mal einen Bildschirmaufnahme erstellt:

Jetzt ist meine Fragen,

1. Wieso funktioniert das Scrollen mit dem JScrollPane nicht, wenn ich das Fenster verkleinere?
2. Was würdet ihr anderes machen oder verbessern?
3. Welchen Code müsst ihr dz. sehen?

Importiert hab ich:

import java.io.*;
import java.text.*;
import java.util.*;
import java.util.regex.*;
import javax.swing.*;```

`AWT`, weil ich ein `Canvas` gewählt hab.

Danke für eure antworten.
  1. Weil die darin enthaltene Component “getPreferredSize” nicht passend überschrieben hat
  2. JFreeChart verwenden. (Im Ernst: Es hört nicht auf. Egal, was man macht: Irgendwann denkt man: “Oh, ich würde gerne den vertikalen Abstand zwischen der Achsenbeschriftung und den Achsen-Ticks ändern”, oder “Ich würde gerne bei jedem dritten Mespunkt den Messwert als String danschreiben”, oder “Ich hätte gerne Tooltips mit den Messwerten”. Für “gute” (flexible) Charts braucht man eine Code-Infrastruktur, die (im Vergleich zu dem lächerlichen Chart, den man dann sieht) gigantisch ist. Ich persönlich wollte mir auch schon lange mal https://docs.oracle.com/javafx/2/charts/line-chart.htm#CIHGBCFI ansehen, das sieht auch ganz nett aus)
  3. Alles.

Danke für deinen Beitrag! Das ist genau das, waw ich gesucht hatte.

Es gibt doch auch noch bestimmte Auslöser für Signale eines Kurses, 1-2-3-4- oder so (das hab ich mir nicht ausgedacht). Sollte man versuche, diese selber zu zeichnen (und sich anzueignen) - oder einfach auf die Seite der Bank/Kasse ihres Vertrauenes gehen?

Als nächste werd’ ich mal getPreferredSize() anpassen und dann evtl. den Text posten.

Ok, es fängt wahrscheinlich schon bei der Datenklasse an,


    /**
     * 0 und 1 = nach date; 2 und 3 = nach y.
     */
    public static int sortBy = 1;

    private static final DateFormat df = DateFormat.getDateInstance();
    private static int min = Integer.MAX_VALUE;
    private static int max = Integer.MIN_VALUE;
    private static int cnt = 0;
    private final Date date;
    private final double er;
    private final double ho;
    private final double ti;
    private final double sh;
    private int x;
    private int y;

    public Tag(String date, String er, String ho, String ti, String sh) throws ParseException {
        this.date = df.parse(date);
        this.er = Double.parseDouble(er.replace(".", "").replace(',', '.'));
        this.ho = Double.parseDouble(ho.replace(".", "").replace(',', '.'));
        this.ti = Double.parseDouble(ti.replace(".", "").replace(',', '.'));
        this.sh = Double.parseDouble(sh.replace(".", "").replace(',', '.'));
        x = cnt++;
        y = (int) Math.round((this.er + this.ho + this.ti + this.sh) / 4.0);
        if (y < min) {
            min = y;
        }
        if (y > max) {
            max = y;
        }
    }

    @Override
    public int compareTo(Tag o) {
        switch (sortBy) {
            case 0:
                return date.compareTo(o.date);
            case 1:
                return o.date.compareTo(date);
            case 2:
                return Integer.compare(y, o.y);
            case 3:
                return Integer.compare(o.y, y);
            default:
                throw new AssertionError();
        }
    }

    public Date getDate() {
        return date;
    }

    public double getEr() {
        return er;
    }

    public double getHo() {
        return ho;
    }

    public double getTi() {
        return ti;
    }

    public double getSh() {
        return sh;
    }

    public void calcY(int w, int h) {
        x = Math.round((float) w / (float) cnt) * (cnt - x);
        y = (max - y) * h / (max - min);
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    @Override
    public String toString() {
        return "Tag{" + "date=" + date + ", er=" + er + ", ho=" + ho + ", ti=" + ti + ", sh=" + sh + ", x=" + x + ", y=" + y + '}';
    }

}```

"Logik" im Konstruktor, calcY sollte aufgerufen werden, wenn die Liste vollständig ist. cnt, wie viele Tage gibt es?, ist "suboptimal". Ich les' die Tage rückwärts ein, deswegen gibt's verschiedene Sortierrichtungen. Ich muss dann nach einem zeichnen, mehrmals neu sortieren. `/ (val)` sollte ungenau sein. `toString()` hat ide kreiert. Was wäre denn besser?

Ich fall vom Glauben ab.

     * 0 und 1 = nach date; 2 und 3 = nach y.
     */
    public static int sortBy = 1;

    @Override
    public int compareTo(Tag o) {
        switch (sortBy) {
            case 0:
                return date.compareTo(o.date);
            case 1:
                return o.date.compareTo(date);
            case 2:
                return Integer.compare(y, o.y);
            case 3:
                return Integer.compare(o.y, y);
            default:
                throw new AssertionError();
        }
    }```

Dass ist der Grund warum man Comparatoren verwendet. Sollte sich das selbe Datenobjekt in mehreren unterschiedlich zu sortierenden Listen befinden dann gibt das Chaos pur wenn die globale Variable mitten im Sortiervorgang geändert wird. Comparatoren kann man spezifisch zuweisen.

Schau dir dazu mal die Java-Api an. Insbesondere mit Java 8 hat sich hier etwas entwickelt.

[Comparator (Java Platform SE 8 )](http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html)

reversed() ist Interessant zum umschalten zwischen auf und absteigend.

Di Va Na Le Mi Ni Ei

Häh?
[spoiler]
Die Variablennamen Leuchten Mir Nicht Ein
[/spoiler]

Anonsten sehe ich nicht, was das mit dem Chart zu tun hat. Der Chart sollte so weit wie möglich unabhängig vom konkreten “Typ” des Datensatzes sein, also in bezug auf die Datengrundlage. (Der Programmatische Typ kann sehr ausgefeilt sein… Dataset (JFreeChart Class Library (version 1.0.19-fx)) )

[QUOTE=Marco13]Di Va Na Le Mi Ni Ei

Häh?
[spoiler]
Die Variablennamen Leuchten Mir Nicht Ein
[/spoiler]

Anonsten sehe ich nicht, was das mit dem Chart zu tun hat. Der Chart sollte so weit wie möglich unabhängig vom konkreten “Typ” des Datensatzes sein, also in bezug auf die Datengrundlage. (Der Programmatische Typ kann sehr ausgefeilt sein… Dataset (JFreeChart Class Library (version 1.0.19-fx)) )[/QUOTE]

Danke, das Problem ist [gelöst]. Variablennamen: datum, eröffnung, hoch, tief, schluss. Signale eines Kurses, werde ich niemals ohne das nötige Wissen verstehen.

Ich setze das Thema mal auf [gelöst].