JavaFX ObservableList in einer ArrayList speichern.

missy72

Bekanntes Mitglied
Hallo, liebe Java-Gemeinde.

Ich habe vor vier Wochen begonnen Java zu erlernen. Dabei haben mir auch immer wieder Threads aus diesem Forum weitergeholfen.
Da ich jetzt schon den dritten Tag über ein Problem grübel, habe ich mich entschlossen, auch mal direkt eine Frage zu stellen.
Im Vorfeld habe ich natürlich das Internet und das Forum auf eine mögliche Antwort durchsucht.

1. Ich habe eine Klasse erstellt mit vier Variablen im Format SimpleStringProperty.
2. Die erstellten Objekte speichere ich in einer ObservableList, damit ich diese in einer TableView anzeigen lassen kann.
3. Jetzt kann ich beliebig viele Objekte erstellen, in der Liste speichern und anzeigen lassen.
4. Wenn ich eine neue Liste erstellen möchte, speichere ich die aktuelle Liste mit einer Uhrzeit in einer ArrayListe.

// Bis hierhin scheint alles zu funktionieren.

5. Jetzt möchte ich die ArrayListe, Objekt für Objekt, über ListIterator zurückblättern.
Dabei bekomme ich die Uhrzeit (String) über den Getter ausgelesen.
Beim Auslesen der ObservableList über den Getter bekommen ich nur ein leeren Wert [].

Über Eure Hilfe bedanke ich mich schon mal im Vorraus.
MfG M.B.


[CODE lang="java" title="Ausschnitt"] class Main{

// Deklarieren
ArrayList<Einkaufsliste>einkaufsListe = new ArrayList<Einkaufsliste>();
ObservableList<Artikel> tagesListe = FXCollections.observableArrayList();

// ObsevableList
Artikel tempArtikel = new Artikel(menge, artikel, datum, id);
tagesListe.add(tempArtikel);

// ArrayList
Einkaufsliste tempListe = new Einkaufsliste(datum, tagesListe);
einkaufsListe.add(tempListe);

// zurückliesen ArrayList
ListIterator<Einkaufsliste> iteratorEinkaufsListe = einkaufsListe.listIterator(counter);
Einkaufsliste tempList = (iteratorEinkaufsListe.next());
}

public class Artikel {

private SimpleStringProperty menge;
private SimpleStringProperty artikel;
private SimpleStringProperty datum;
private SimpleStringProperty id;

public Artikel (String menge, String artikel, String datum, String id) {
this.menge = new SimpleStringProperty(menge);
this.artikel = new SimpleStringProperty(artikel);
this.datum = new SimpleStringProperty(datum);
this.id = new SimpleStringProperty(id);
}

public class Einkaufsliste {

String datum;
ObservableList<Artikel> artikelListe;


public Einkaufsliste (String newDatum, ObservableList<Artikel> newListe) {
this.datum = newDatum;
this.artikelListe = newListe;
}

public String getDatum() {
return datum;
}
public void setDatum(String datum) {
this.datum = datum;
}

public ObservableList<Artikel> getArtikelListe() {
return artikelListe;
}
public void setEinkaufsListe(ObservableList<Artikel> artikelListe) {
this.artikelListe = artikelListe;
}


[/CODE]
 
Zuletzt bearbeitet:
Schwierig zu sagen, was genau dad Problem ist und wo es auftritt. Mal ins Blaue geraten: du erstellst nicht neue Listen, sondern nutzt stattdessen clear?

Kannst du ein minimales, ausführbares Beispiel zeigen, mit dem man das Problem reproduzieren kann?
 
Guten Morgen,

1. Du hast recht, ich benutze clear, aber vorher verwende ich die Werte und erstelle ein neues Obejekt.
Analog mach ich mit der Variable Datum das gleiche und das funktioniert. Die Uhrzeit wird jedes mal
mit einem neuen Wert in der ArrayListe gespeichert.
Vielleicht habe ich hier ja noch ein grundlegenden Denkfehler.


[CODE lang="java" title="Ausschnitt"]
// Erstellen der ArrayListe
Einkaufsliste tempListe = new Einkaufsliste(datum, tagesListe);
einkaufsListe.add(tempListe);

// Arbeitsliste Werte zurücksetzten, bzw. modifizieren
date = Calendar.getInstance().getTime();
datum = getDatum.format(date);
tagesListe.clear();

[/CODE]

2. Vielleicht hat jemand einen Link zu einem Literaturhinweis, oder Programmbeispiel.
Parallel werde ich mal versuchen das Programm auf das wesentliche zu reduzieren.

MfG M.B.
 
Guten Morgen,

1. Du hast recht, ich benutze clear, aber vorher verwende ich die Werte und erstelle ein neues Obejekt.
Analog mach ich mit der Variable Datum das gleiche und das funktioniert. Die Uhrzeit wird jedes mal
mit einem neuen Wert in der ArrayListe gespeichert.
Vielleicht habe ich hier ja noch ein grundlegenden Denkfehler.


[CODE lang="java" title="Ausschnitt"]
// Erstellen der ArrayListe
Einkaufsliste tempListe = new Einkaufsliste(datum, tagesListe);
einkaufsListe.add(tempListe);

// Arbeitsliste Werte zurücksetzten, bzw. modifizieren
date = Calendar.getInstance().getTime();
datum = getDatum.format(date);
tagesListe.clear();

[/CODE]

2. Vielleicht hat jemand einen Link zu einem Literaturhinweis, oder Programmbeispiel.
Parallel werde ich mal versuchen das Programm auf das wesentliche zu reduzieren.

MfG M.B.
Kannst du die komplette Klasse zeigen?
 
Hallo lam_tr,

ich zeige hier mal die Controller-, Artikel und Einkaufs-Klasse.
Bitte beachten, dass das Programm und auch diese Klasse noch am Anfang des Entwicklungsprozesses ist und
ich ein blutiger Anfänger.
Heute Abend werde ich aber, wie von mrBrown vorgeschlagen, ein vereinfachtes Prgramm erstellen und hier einstellen.

Java:
package application;

import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.ListIterator;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;


public class Controller {
  
    @FXML Label anzeigeListe;
    @FXML TextField inputMenge;
    @FXML TextField inputArtikel;
    @FXML Button    inputUebergabe;
    @FXML Button    vorListe;
    @FXML Button    backListe; 
    @FXML Button     newListe;
    @FXML TableView<Artikel> mainList;
    @FXML TableColumn<Artikel, String> colMenge;
    @FXML TableColumn<Artikel, String> colArtikel;
    @FXML TableColumn<Artikel, String> colDatum;
    @FXML TableColumn<Artikel, String> colID;
  
    @FXML Button help;
  
  
    String menge;
    String artikel;
//        Date date = Calendar.getInstance().getTime();
//        DateFormat getDatum = DateFormat.getDateInstance(DateFormat.SHORT);
//    String datum = getDatum.format(date);
    String id = "MB";
  
    int counter = 1;

        Date date = Calendar.getInstance().getTime();
        DateFormat getDatum = DateFormat.getTimeInstance(DateFormat.DEFAULT);
        String datum = getDatum.format(date);
  
  
    ArrayList<Einkaufsliste>einkaufsListe  = new ArrayList<Einkaufsliste>(); 
    ObservableList<Artikel> tagesListe = FXCollections.observableArrayList();
              
//**************************************************************************************** 
    public void addArtikel(ActionEvent event) {
      
                          
        if (inputArtikel.getText().equals("")){
            return;         
            } 
      
        menge = inputMenge.getText();
        artikel = inputArtikel.getText();
      
        Artikel tempArtikel = new Artikel(menge, artikel, datum, id);
        tagesListe.add(tempArtikel);
      
        colMenge.setCellValueFactory(new PropertyValueFactory<>("menge"));
        colArtikel.setCellValueFactory(new PropertyValueFactory<>("artikel"));
        colDatum.setCellValueFactory(new PropertyValueFactory<>("datum"));
        colID.setCellValueFactory(new PropertyValueFactory<>("ID"));
        mainList.setItems(tagesListe);
              
        inputMenge.setText("1");
        inputArtikel.setText("");
      
    }
  
//**************************************************************************************** 
    public void newList(ActionEvent event) {
        if (tagesListe.size()==0) {
            return;
        } 

        Einkaufsliste tempListe = new Einkaufsliste(datum, tagesListe);     
        einkaufsListe.add(tempListe);
  
        counter ++;     
              
        date = Calendar.getInstance().getTime();
        datum = getDatum.format(date); 
        tagesListe.clear();
      
        int tabLenght = einkaufsListe.size(); 
        anzeigeListe.setText("Liste " + Integer.toString(counter) + "/" + Integer.toString(tabLenght+1));
              
    }

//****************************************************************************************
    public void minusList(ActionEvent event) {
      
        int tabLenght = einkaufsListe.size();
              
        if (counter > 1) { 
            counter --;
        } 
      
      
      
        anzeigeListe.setText(Integer.toString(counter)+ " / "+Integer.toString(tabLenght));
                      
        ListIterator<Einkaufsliste> iteratorEinkaufsListe = einkaufsListe.listIterator(counter-1);     
        Einkaufsliste tempList = (iteratorEinkaufsListe.next());
      
                                System.out.println();
                                System.out.println("Counter:  "+counter);
                                System.out.println("getDatum: "+ tempList.getDatum());
                                System.out.println("getListe: "+ tempList.getArtikelListe());
                              
          
      
      
    }
  
//****************************************************************************************
    public void plusList(ActionEvent event) {
      

      
        int tabLenght = einkaufsListe.size(); 
          
          
            if (counter < tabLenght) { 
                counter ++;
            } 
          
            anzeigeListe.setText(Integer.toString(counter)+ " / "+Integer.toString(tabLenght));
          
            ListIterator<Einkaufsliste> iteratorEinkaufsListe = einkaufsListe.listIterator(counter-1);     
            Einkaufsliste tempList = (iteratorEinkaufsListe.next());
          
                                    System.out.println();
                                    System.out.println("Counter:  "+counter);
                                    System.out.println("getDatum: "+ tempList.getDatum());
                                    System.out.println("getListe: "+ tempList.getArtikelListe());
      
    }

//****************************************************************************************
  
  
    public void help(ActionEvent event) {
      
//        System.out.println();
//        System.out.println("help");
//        System.out.println(counter);
//        System.out.println(einkaufsListe.size());
//        System.out.println(tagesListe);
//        System.out.println(einkaufsListe);
//        System.out.println();
      
      
        ListIterator<Artikel> iterator = tagesListe.listIterator(0);     
        Artikel tempList = (iterator.next());
      
        System.out.println(tempList);
        System.out.println(tempList.getArtikel());
        tempList.setArtikel("Test");
      
      
      
      
    }
  
} // Ende der CLASS

[CODE lang="java" title="Einkaufsliste"]package application;


import javafx.collections.ObservableList;


public class Einkaufsliste {

String datum;
ObservableList<Artikel> artikelListe;


public Einkaufsliste (String newDatum, ObservableList<Artikel> newListe) {
this.datum = newDatum;
this.artikelListe = newListe;

}

public String getDatum() {
return datum;
}
public void setDatum(String datum) {
this.datum = datum;
}

public ObservableList<Artikel> getArtikelListe() {
return artikelListe;
}
public void setEinkaufsListe(ObservableList<Artikel> artikelListe) {
this.artikelListe = artikelListe;
}


public static Einkaufsliste makeArtikelListe (String newDatum, ObservableList<Artikel> newList ) {
return new Einkaufsliste(newDatum, newList);
}

}[/CODE]

Java:
package application;

import javafx.beans.property.SimpleStringProperty;

public class Artikel {
   
    private SimpleStringProperty menge;
    private SimpleStringProperty artikel;
    private SimpleStringProperty datum;
    private SimpleStringProperty id;
   
    public Artikel (String menge, String artikel, String datum, String id) {
        this.menge = new SimpleStringProperty(menge);
        this.artikel = new SimpleStringProperty(artikel);
        this.datum = new SimpleStringProperty(datum);
        this.id = new SimpleStringProperty(id);      
    }
   
// Beachte! Besondere Getter and Setter    wegen SimpleStringPropety
   
    public String getMenge() {
        return menge.get();
    }
    public void setMenge(String loadMenge) {
        artikel.set(loadMenge);
    }
       
    public String getArtikel() {
        return artikel.get();
    }
    public void setArtikel(String loadArtikel) {
        artikel.set(loadArtikel);
    }
   
    public String getDatum() {
        return datum.get();
    }
   
    public void setDatum(String loadDatum) {
        datum.set(loadDatum);
    }
   
    public String getID() {
        return id.get();
    }
   
    public void setID(String loadID) {
        id.set(loadID);
    }
   
       
    public static Artikel makeArtikel (String menge, String artikel, String datum, String id) {      
        return new Artikel (menge,artikel,datum,id);  
    }  
}
 
Zuletzt bearbeitet:
Es existiert nur eine einzige ObservableList<Artikel>, und alle Einkaufsliste-Objekte und die GUI teilen sich diese Liste. Wenn du diese eine Liste leerst, sind damit auch alle Listen in Einkaufsliste leer.
 
Nachtrag:
Ich habe nun eine weiltere Klasse, Artikelliste, zugefügt und siehe da, es läuft.😀
Noch mal danke. Bis zum nächsten mal.

Java:
        Artikelliste  tempArtikelListe = new Artikelliste(tagesListe);
        Einkaufsliste tempEinkaufsliste= new Einkaufsliste(datum, tempArtikelListe);
        einkaufsListe.add(tempEinkaufsliste);
 

Neue Themen


Zurück
Oben