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