FAQ

Zur Nutzung der FAQ

Diese FAQ beschäftigt sich ausschließlich mit Fragen zum Framework. Fragen zum Praktikum werden auf der entsprechenden FAQ-Seite zum Praktikum beantwortet. Außerdem findet man dort Hilfe bei allgemeinen Problemen mit Java und den Entwicklungswerkzeugen.


Wo gibt es den Quellcode von SalesPoint?

Der Quellcode wird nicht zum Download bereitgestellt. Bei Interesse kann aber über die Javadoc auf ihn zugegriffen werden. In der Detailansicht einer Klasse klickt man dazu auf den Klassen- oder einen Methodennamen und gelangt an die entsprechende Stelle im Code.


Wie kann ich mit meiner Tabelle dies und jenes anzeigen lassen?

Die Darstellung von Tabellen wird vom TableEntryDescriptor gesteuert. Dieser ist dem sogenannten Tabellenmodell, welches für die originalen Swing-Tabellen benutzt wird, sehr änlich. Das auf den folgenden Seiten vermittelte Wissen lässt sich deshalb ohne größere Probleme für SalesPoint-Tabellen nutzen:


Wie kann ich CatalogItems editierbar machen?

Um sich ein editierbares CatalogItem zu holen, ist die get() Methode des Catalogs zu verwenden. Ist der dritte Parameter true, ist das zurückgegebene CatalogItem editierbar.

CatalogItem ciEditable = myCatalog.get("key1", db, true);
            

Dabei ist zu beachten, dass ein ShallowClone zurückgeliefert wird, nicht das originale CatalogItem. Der DataBasket darf nicht null sein.


Wie kann ich Kataloge schachteln?

Man kann einem Katalog mit der add() Methode einen anderen Katalog als "Kind" hinzufügen. Allerdings ist der Kindkatalog nicht editierbar und kann damit keine weiteren CatalogItems aufnehmen. Man kann den Kindkatalog wie ein gewöhnliches CatalogItem editerbar machen (Wie kann ich CatalogItems editierbar machen?) oder die Methode getEditableCopy(DataBasket db) verwenden. Der DataBasket darf dabei nicht null sein.


Die Methode getCatalog() liefert mir null zurück, obwohl ich den Catalog gesetzt habe.

Ein oft gemachter Fehler ist, die Kataloge am Shop anzumelden bevor der Shop gesetzt wurde. Es ist wichtig, dass zuerst setTheShop() ausgeführt wird und erst danach Kataloge und Stocks gesetzt werden.


Beim Iterieren bekomme ich eine ConcurrentModificationException.

Das geschieht, wenn der Iterator feststellt, dass sich die Datenbasis, über die er iteriert, verändert hat. Um potentiell falsche Ergebnisse zu vermeiden wird lieber kontrolliert abgebrochen. Vermutlich wurde versucht, mit dem Iterator ein Objekt (z.B. CatalogItem) zu finden und dies dann aus dem Katalog zu löschen. Um den Fehler zu vermeiden, ist statt der remove() Methode des Kataloges (Stocks,...) die remove() Methode des Iterators zu benutzen.


Ich kann keine Items im TwoTableFormSheet verschieben.

Wenn man sich ein TwoTableFormSheet an einem Gate anzeigen lässt, muss man darauf achten, dass das Gate zum Zeitpunkt, zu dem das FormSheet erzeugt wird, bereits existiert. Folgender Code funktioniert:

Gate testGate = new UIGate(null, null);
TwoTableFormSheet ttfs = TwoTableFormSheet.create(. . .);
testGate.setFormSheet(ttfs);
            

Dieser dagegen nicht:

Gate testGate = null;
TwoTableFormSheet ttfs = TwoTableFormSheet.create(. . .);
testGate = new UIGate(ttfs, null);
            

Wie kann ich die Oberfläche meines Shops anpassen?

Erzeuge eine Unterklasse von sale.multiwindow.MultiWindow. Das ist die Klasse, die für die Shopoberfläche verantwortlich ist. In dieser Klasse überschreibe die Methode createFramePane(). Es muss ein JPanel zurückgeliefert werden, das JPanel wird die Shopoberfläche sein, es kann beliebig verschönert werden. In der Shop-Klasse überschreibe die Methode createShopFrame(), so dass sie das neue MultiWindow zurückliefert.

Klasse MyShop:

            ...
protected sale.multiwindow.MultiWindow createShopFrame() {
    return new MyShopFrame(getTheShop());
}
            ...
            

Klasse MyShopFrame:

           ...
public MyShopFrame(Shop s) {
    super(s, WINDOW_VIEW);
}

protected JPanel createFramePane() {
    JPanel jp = new JPanel();
    jp.add(new JLabel("Mein Shop"));
    return jp;
}
           ...
        	

Der DataBasket in meinem Prozess ist null, obwohl ich einen DataBasket zugewiesen habe.

Beim Starten eines Prozesses übernimmt der Prozess automatisch den DataBasket vom SalesPoint, auf dem er läuft. Der DataBasket sollte also schon an den SalesPoint gehängt worden sein. Falls der DataBasket im Prozess gesetzt werden muss, darf das nicht im Konstruktor passieren. Die Methode getInitialGate() bietet sich stattdessen an.


Wie kann ich Kataloge/Stocks filtern?

Dafür gibt es spezielle Catalog- und StockFilter (package data.filters). Zum Anzeigen der gefilterten Daten werden diese anstatt der originalen Stocks/Kataloge an die FormSheets übergeben. Es ist nicht möglich, die Filterung im TED vorzunehmen. Man kann zwar dort die Anzeige von Items unterdrücken, es würde aber dennoch eine leere Zeile angezeigt.





by s6200595