Hallo zusammen,
ich bin Java-Anfänger und Programmier-Amateur. Bitte verzeiht mir daher evtl. falsches Wording...
Mein erstes Javafx-Programm, das ich mit eclipse erstelle, ermöglicht es, Timelines als SVG-Dateien zu erstellen. Hierzu kann der User einzelne Shapes erstellen, ändern. und löschen. Zusätzlich können einige Attribute übergeordnet festgelegt werden (Settings), die auf alle Shapes angewendet werden (z.B. die Standard-Höhe, Schriftart etc.). Einige Shapes (z.B. die Zeitleiste) werden standardmäßig auf Basis der Settings automatisch erstellt. Die Shapes werden in einem TableView im Interface in Verbindung mit einer ObservableList dargestellt und können auf Basis dessen manipuliert werden. Der User kann sich jederzeit die Projektdatei als XML oder auch die Timeline als SVG-Datei speichern. Die SVG-Datei wird während des Erstellens in einem WebView dargestellt. Das funktioniert auch alles schon ganz gut.
Knackpunkt ist nun das Laden einer Projektdatei. Beim Erststart des Programms werden immer vodefinierte Settings defniert und die Standard Shapes erstellt und diese in die ObservableList "opShapeList" geschrieben. Für das Laden der Projektdatei soll nun opShapeList geleert werden und mit den Daten aus der XML-Datei neu gefüllt werden. Ich habe eine Hauptklasse "MyController". Diese erstellt eine Instanz der Klasse "timeline", die als Basis der XML-Projekt-Datei dient.
Nach tagelangem Rumtesten ist es mir gelungen, die opShapeList und das TableView "tbvShape" zu leeren und mit den Daten aus der geladenen Datei zu befüllen.
In der opShapeList sind ausschließlich die richtigen Shapes. Das passt soweit. Die SVG-Datei erstelle ich über die timeline-Klasse, welche auch das WebView befüttert. Nun habe ich mich gewundert, dass im WebView und auch beim Speichern der SVG-Datei die Shapes aus der geladenen Projekt-Datei nicht auftauchen. Nach einer Überprüfung habe ich festgestellt, dass die shapeList aus der Timeline-Klasse sowohl die neuen auls auch die alten Shapes enthält. Und noch kurioser ist, dass beim Verarbeiten der shapeList (Erstellen der SVG-Strings) nur die "alten Daten", nicht aber die Daten aus der geladenen Projekt-Datei behandelt/erkannt wurden.
In der If-Bedingung werden die "alten" Daten erkannt, die neuen jedoch nicht. Ich verstehe weder das eine noch das Andere.
Über Hilfe wäre ich sehr dankbar!
Grüße,
Mace
ich bin Java-Anfänger und Programmier-Amateur. Bitte verzeiht mir daher evtl. falsches Wording...
Mein erstes Javafx-Programm, das ich mit eclipse erstelle, ermöglicht es, Timelines als SVG-Dateien zu erstellen. Hierzu kann der User einzelne Shapes erstellen, ändern. und löschen. Zusätzlich können einige Attribute übergeordnet festgelegt werden (Settings), die auf alle Shapes angewendet werden (z.B. die Standard-Höhe, Schriftart etc.). Einige Shapes (z.B. die Zeitleiste) werden standardmäßig auf Basis der Settings automatisch erstellt. Die Shapes werden in einem TableView im Interface in Verbindung mit einer ObservableList dargestellt und können auf Basis dessen manipuliert werden. Der User kann sich jederzeit die Projektdatei als XML oder auch die Timeline als SVG-Datei speichern. Die SVG-Datei wird während des Erstellens in einem WebView dargestellt. Das funktioniert auch alles schon ganz gut.
Knackpunkt ist nun das Laden einer Projektdatei. Beim Erststart des Programms werden immer vodefinierte Settings defniert und die Standard Shapes erstellt und diese in die ObservableList "opShapeList" geschrieben. Für das Laden der Projektdatei soll nun opShapeList geleert werden und mit den Daten aus der XML-Datei neu gefüllt werden. Ich habe eine Hauptklasse "MyController". Diese erstellt eine Instanz der Klasse "timeline", die als Basis der XML-Projekt-Datei dient.
Nach tagelangem Rumtesten ist es mir gelungen, die opShapeList und das TableView "tbvShape" zu leeren und mit den Daten aus der geladenen Datei zu befüllen.
Code:
ArrayList<shape> opShapeList = new ArrayList<shape>();
ObservableList<shape> opShapeData;
public timeline timeline = new timeline();
...
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
...
timeline.setShapeList(opShapeList);
opShapeData = FXCollections.observableList(opShapeList);
...
}
public void loadProject() throws Exception {
...
opShapeData.removeAll(opShapeData);
timeline = (timeline) unmarshaller.unmarshal(file);
opShapeList = timeline.getShapesList();
opShapeData = FXCollections.observableList(opShapeList);
tbvShape.setItems(opShapeData);
}
In der opShapeList sind ausschließlich die richtigen Shapes. Das passt soweit. Die SVG-Datei erstelle ich über die timeline-Klasse, welche auch das WebView befüttert. Nun habe ich mich gewundert, dass im WebView und auch beim Speichern der SVG-Datei die Shapes aus der geladenen Projekt-Datei nicht auftauchen. Nach einer Überprüfung habe ich festgestellt, dass die shapeList aus der Timeline-Klasse sowohl die neuen auls auch die alten Shapes enthält. Und noch kurioser ist, dass beim Verarbeiten der shapeList (Erstellen der SVG-Strings) nur die "alten Daten", nicht aber die Daten aus der geladenen Projekt-Datei behandelt/erkannt wurden.
Code:
public void createSVG() {
DocHead oHead = new DocHead();
oHead.setTimelineWidth(timelineWidth);
oHead.setTimelineHeight(timelineHeight);
svgString = oHead.getHeadString() + "\n";
for (shape shape : shapeList) {
System.out.println("-- Shape: " + shape.getId() + " from "
+ shape.getCategory() + " type " + shape.getType().toLowerCase());
if (shape.getType().toLowerCase() == "rectangle") {
...
}
In der If-Bedingung werden die "alten" Daten erkannt, die neuen jedoch nicht. Ich verstehe weder das eine noch das Andere.
Über Hilfe wäre ich sehr dankbar!
Grüße,
Mace