jeudi 19 décembre 2019

Observer pattern in javaFX with tableview

I use the observer pattern to update a second screen in javaFX. The pattern works fine, the items that are being transfered are correct aswell. I have no idea why this doesn't work. I have tried debugging it. But it shows exactly what it should show.

The second screen just doesn't get any updates.

Anyway if someone could help me out, I would be forever grateful.

Following are all the methods that are being used in this process.

Screen 1:

package view;

import controller.ArtikelController;

import database.Methode;
import domain.Artikel;
import domain.KortingEnum;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import jxl.read.biff.BiffException;
import model.decorator.FooterMetBericht;
import model.decorator.HeaderMetAlgInfo;
import model.decorator.Kassabon;
import model.decorator.KassabonAbstract;
import model.observer.Observer;

import java.io.IOException;
import java.util.List;

public class KassaTab extends GridPane implements Observer {
    private ArtikelController artikelController;
    private TableView table;
    private String artNr;

    public KassaTab() {
        this.artikelController = new ArtikelController();
        this.setPadding(new Insets(5, 5, 5, 5));
        this.setVgap(5);
        this.setHgap(5);

        this.add(new Label("Voeg de artikelcode in om het in je winkelmandje te doen: "), 0, 0, 1, 1);

        Label artikelCodeLabel = new Label("Code: ");
        TextField artikelCodeText = new TextField();
        Button save = new Button("Save");

        HBox knopjes = new HBox(artikelCodeLabel, artikelCodeText, save);

        this.add(knopjes, 0, 2, 1, 1);

        TableColumn artikelNr = new TableColumn<>("Nr");
        TableColumn artikelNaam = new TableColumn<>("Naam");
        TableColumn artikelGroep = new TableColumn<>("Groep");
        TableColumn artikelPrijs = new TableColumn<>("Prijs");
        TableColumn artikelVoorraad = new TableColumn<>("Voorraad");

        artikelNr.setCellValueFactory(new PropertyValueFactory("artikelNr"));
        artikelNaam.setCellValueFactory(new PropertyValueFactory("artikelNaam"));
        artikelGroep.setCellValueFactory(new PropertyValueFactory("artikelGroep"));
        artikelPrijs.setCellValueFactory(new PropertyValueFactory("artikelPrijs"));
        artikelVoorraad.setCellValueFactory(new PropertyValueFactory("artikelVoorraad"));

        table = new TableView<String>();
        table.setPrefWidth(REMAINING);
        table.getColumns().addAll(artikelNr, artikelNaam, artikelGroep, artikelPrijs, artikelVoorraad);
        table.getSortOrder().add(artikelNaam);

        HBox totaal = new HBox(totaalLabel, bedragLabel);

        add(totaal, 0, 3, 1, 1);
        add(table, 0, 7, 2, 2);

        save.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                try {
                    String artikelNrke = artikelCodeText.getText();
                    artNr = artikelNrke;

                    if (!artikelController.correctNr(artikelNrke)) {
                        Alert alert = new Alert(Alert.AlertType.ERROR);
                        alert.setHeaderText("Error in het artikel nummer");
                        alert.setContentText("Het artikel nummer dat U invoerde bestaat niet.");
                        alert.showAndWait();
                    } else {
                        table.setItems(artikelController.getVerkoopObservable(artikelNrke)); //hier wordt het artikel met de meegegeven code opgezocht in de lijst
                        bedragLabel.setText(Double.toString(artikelController.getVerkoopPrijs(artikelNrke)));
                        artikelController.doObserver();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

Controller methods from controller class:

    public void doObserver() throws IOException, BiffException {
        ArtikelDbInMemory.getInstance().notifyObservers(getKlantObservable());
    }

   public ObservableList<Artikel> getKlantObservable() throws BiffException, IOException {
        ObservableList<Artikel> artikels = FXCollections.observableArrayList(mapToListArtikel(getVerkoopArtikelsNietDubbel(getAllScannedArtikelsv2())));
        return artikels;
    }

    public List<Artikel> mapToListArtikel(Map<String, List<Artikel>> artikels) {
        List<Artikel> arts = new ArrayList<>();

        for (String key:artikels.keySet()) {
            arts.addAll(artikels.get(key));
        }
        return arts;
    }

public Map<String, List<Artikel>> getVerkoopArtikelsNietDubbel(List<Artikel> kutlijst) throws BiffException, IOException {
        Map<String, List<Artikel>> artikelMap = new HashMap<>();

        for (Artikel a: kutlijst) {
            if (artikelMap.containsKey(a.getArtikelNr())) {
                List<Artikel> artikelLijst = new ArrayList<>();
                Artikel artikel = new Artikel(a.getArtikelNr(), a.getArtikelNaam(), a.getArtikelGroep(), a.getArtikelPrijs(), a.getArtikelVoorraad());
                artikelLijst.add(artikel);
                artikelMap.replace(a.getArtikelNr(), artikelLijst);
            } else {
                List<Artikel> artikelLijst = new ArrayList<>();
                Artikel artikel = new Artikel(a.getArtikelNr(), a.getArtikelNaam(), a.getArtikelGroep(), a.getArtikelPrijs(), a.getArtikelVoorraad());
                artikelLijst.add(artikel);
                artikelMap.put(a.getArtikelNr(), artikelLijst);
            }
        }
        return artikelMap;
    }

    public List<Artikel> getAllScannedArtikelsv2() {
        return verkoopArtikels;
    }

DBInMemory methods:

    public static ArtikelDbInMemory getInstance() {
        if (uniqueInstance == null) {
            synchronized (ArtikelDbInMemory.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new ArtikelDbInMemory();
                }
            }
        }
        return uniqueInstance;
    }

    @Override
    public void notifyObservers(ObservableList<Artikel> klantlist) throws IOException, BiffException {
        for (Observer o: observers) {
            o.update(klantlist);
        }
    }

Observer class:

public interface Observer {
    void update(ObservableList<Artikel> klantlist) throws IOException, BiffException;
}

Observable class:

public interface Observable {
    void addObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers(ObservableList<Artikel> klantlist) throws IOException, BiffException;
}

Screen 2:

package view;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;

import domain.Artikel;

import model.observer.Observer;

import java.util.ArrayList;
import java.util.List;

public class KlantTab extends GridPane implements Observer {
    private TableView table;

    public KlantTab() {
        this.setPadding(new Insets(5,5,5,5));
        this.setVgap(5);
        this.setHgap(5);

        Label totaalLabel = new Label("Totaal: ");

        TableColumn artikelNr = new TableColumn<>("Nr");
        TableColumn artikelNaam = new TableColumn<>("Naam");
        TableColumn artikelGroep = new TableColumn<>("Groep");
        TableColumn artikelPrijs = new TableColumn<>("Prijs");
        TableColumn artikelVoorraad = new TableColumn<>("Voorraad");
        //TableColumn artikelAantal = new TableColumn<>("Aantal");

        artikelNr.setCellValueFactory(new PropertyValueFactory("artikelNr"));
        artikelNaam.setCellValueFactory(new PropertyValueFactory("artikelNaam"));
        artikelGroep.setCellValueFactory(new PropertyValueFactory("artikelGroep"));
        artikelPrijs.setCellValueFactory(new PropertyValueFactory("artikelPrijs"));
        artikelVoorraad.setCellValueFactory(new PropertyValueFactory("artikelVoorraad"));
        //artikelAantal.setCellValueFactory(new PropertyValueFactory("artikelAantal"));

        table = new TableView<String>();
        table.setPrefWidth(REMAINING);
        table.getColumns().addAll(artikelNr, artikelNaam, artikelGroep, artikelPrijs, artikelVoorraad);
        table.getSortOrder().add(artikelNaam);

        HBox hbox = new HBox(totaalLabel);

        add(hbox, 0, 2, 1, 1);
        add(table, 0, 4, 2, 2);
    }

    @Override
    public void update(ObservableList<Artikel> klantlist) {
        System.out.println("Klanten list: " + klantlist);

        table.setItems(klantlist);
        table.refresh();
    }
}

Aucun commentaire:

Enregistrer un commentaire