JavaFX-Diagramm Auto-Skalierung Falsch bei niedrigen Zahlen

8

Ich verwende JavaFX, um ein StackedBarChart zu erstellen. Das Diagramm wird sich ändern, wenn neue Daten eintreffen. Ich simuliere dies mit einer Schaltfläche, die das Diagramm aktualisiert.

Es funktioniert meistens gut, aber mir ist aufgefallen, dass bei niedrigen Werten (Werte kleiner als ~ 100) die Beschriftungen der Y-Achse beim ersten Aktualisieren des Diagramms ein wenig aus dem Rahmen fallen:

Weirder noch, wenn ich das Diagramm ein zweites Mal (oder drittes, viertes ...) aktualisiere, ist die automatische Skalierung der Y-Achse weit weg:

Wenn ich größere Werte (Werte & gt; ~ 1000) verwende, funktioniert die automatische Skalierung gut. Wenn ich die Diagrammanimation deaktiviere, funktioniert die automatische Skalierung einwandfrei. Die automatische Skalierung funktioniert einwandfrei, wenn ich das Diagramm zum ersten Mal aktualisiere, aber nicht danach.

Hier ist der Code, den ich verwende, der ziemlich genau mit dem Code von this <übereinstimmt / a> JavaFX-Tutorial.

%Vor%

Bonusfrage: Die Animation zeigt, selbst wenn sie funktioniert, zwei zusätzliche Abschnitte jedes gestapelten Balkens, die nach Abschluss der Animation verschwinden. Gibt es eine Möglichkeit, diese zusätzlichen Abschnitte während der Animation loszuwerden?

    
Kevin Workman 18.03.2015, 14:27
quelle

2 Antworten

5

Sie benutzen das Diagramm, die Animation und die Modifikation der beobachtbaren Liste in einer Weise, wie es scheint, dass es nicht gemacht werden soll. Nun, ich auch. Ich bin auf solche Probleme gestoßen, darunter ArrayIndexOutOfBounds Exceptions. Kurz gesagt: Die Animation der JavaFX-Charts ist sehr kaputt, so scheint es. Es scheint unzuverlässig und daher unbrauchbar, wenn Sie die Liste direkt ändern.

Ich habe aufgehört, die Animation oder Änderung der Liste zu verwenden und stattdessen die Liste bei jeder Änderung zu setzen. Jede dieser Methoden löste das Problem.

Änderung des Beispiels mit sbc.setData () anstelle von sbc.getData (). clear () und sbc.getData (). addAll (). Das funktioniert, ich. e. Die Animation ist noch an:

%Vor%

Ich habe Zufälligkeit für dein m hinzugefügt, um Veränderungen in den Balken zu sehen.

Aber das eigentliche Problem ist die Art, wie Sie das Diagramm verwenden. Sie sollten die Liste nicht ändern, sondern stattdessen die Daten der Listenelemente ändern. Dann funktioniert die Diagrammanimation wie erwartet, die Balken steigen und fallen mit den Daten.

Beispiel mit "create" (erstellt neue Diagrammliste) und "modify" (ändert die Daten der Liste, erstellt aber keine neue Liste):

%Vor%     
Roland 29.03.2015, 05:56
quelle
2

Das Problem stammt von zwei Dingen.

  1. Hinzufügen und Entfernen von Daten zur gleichen Zeit (vor dem Start von Animationen)
  2. Die automatische Skalierung der Y-Achse, um sie an die animierten Daten anzupassen

Indem Sie die alten Daten sbc.getData().clear() entfernen und gleichzeitig neue Daten sbc.getData().addAll(series1, series2); hinzufügen, bewirken Sie, dass zwei Gruppen von Animationen gleichzeitig gestartet werden.

Ich habe Ihren Code (am Ende des Posts) geändert, indem ich die Update-Funktion in Clear- und Update-Funktionen aufgetaucht und eine Vielzahl von Tasten für sie hinzugefügt habe.

  • Löschen
  • Aktualisieren
  • Löschen & amp; Aktualisieren
  • Löschen & amp; Später aktualisieren
  • Löschen (kein Anim) & amp; Aktualisieren

Führen Sie das Programm zweimal nebeneinander aus, eines mit kleinen Werten und eines mit großen Werten.

Wenn Sie auf update klicken, sehen Sie, dass die Daten für beide Daten fallen. Wenn Sie diese Daten löschen, sehen Sie die Entfernungsanimation, beachten Sie aber die Y-Achsenskalierung. Dies gilt für beide Datensätze. Es bleibt dasselbe, auch wenn Sie Werte in Millionen verwenden.

Wenn Sie Clear & amp; Aktualisieren Sie die yAxis passt die größeren Werte, die animiert werden. Bei kleinen Werten dominieren die alten Daten, weil sie während der Animation größer werden und größer bleiben als die neuen Daten. Bei großen Werten dominieren die neuen Daten, da sie größer sind als der Endzeitpunkt der alten Daten.

Dann werden am Ende der Entfernungsanimation die alten Daten gelöscht, aber die y-Achse bleibt in Ruhe und im Fall kleiner Werte sieht sie vollständig aus FUBARd aus.

Ich persönlich halte das für einen Fehler in JavaFX. Es fühlt sich fast so an, als würden die Animationen mit y bei 650 beginnen und aufhören. Ich sage das, weil beim Hinzufügen von Daten mit kleinen Werten die Balken scheinbar an ihren Platz fallen, aber bei großen Werten scheinen sie an ihrem Platz zu wachsen. Das kann ich nicht mit Sicherheit sagen, da ich keinen Code-Tauchgang gemacht habe.

Die erste Lösung, an die ich denke, besteht darin, der y-Achse zu sagen, dass sie nach Abschluss aller Animationen automatisch skaliert werden soll. Ich denke jedoch nicht, dass es derzeit eine Möglichkeit gibt, benachrichtigt zu werden, wenn das Diagramm fertig animiert ist. Das mag falsch sein, aber ich denke nicht, dass es trotzdem wichtig ist. Die Balken würden auf sehr kleine Größen skalieren und dann wieder groß werden. Das Endergebnis ist in Ordnung, aber eine seltsame und verzögerte Benutzererfahrung.

Bearbeiten : Wie Roland unten erwähnt hat, riecht die Methode im nächsten Abschnitt etwas nach Code. Ich verlasse es hier, weil es funktioniert, aber benutze es nicht. Benutze entweder meinen letzten Vorschlag oder die Art, wie Roland in seiner Antwort angibt.

Eine Umgehung besteht darin, nicht beide Animationen gleichzeitig zu starten. Die letzte laufende Animation muss diejenige sein, die Daten hinzufügt. Dies kann im Code für die Clear & amp; Später aktualisieren Aber das sieht mir immer noch etwas komisch aus.

Die Art, die ich visuell bevorzuge, was ich denke, löst auch die Bonusfrage; Animieren Sie keine Datenentfernung. Wenn Sie es kurz zuvor ausschalten und danach wieder aktivieren, erhalten Sie schöne neue Daten, die animiert werden und die alten Daten werden einfach poof. Gesehen mit dem Clear (kein Anim) & amp; Schaltfläche Aktualisieren.

%Vor%     
Appak 28.03.2015 01:16
quelle

Tags und Links