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("TTFS", ci, cs, db, testGate); testGate.setFormSheet(ttfs);
Dieser dagegen nicht:
Gate testGate = null; TwoTableFormSheet ttfs = TwoTableFormSheet.create("TTFS", ci, cs, db, testGate); 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.