Java saját szoftver készítése 7. rész – OrderDetailsDialog problémák

Hú, egy jó érdekes feladatba futottam bele, gondoltam megosztom mindenkivel. Van az OrderDetailsDialog osztályom, ami gyakorlatilag egy JDialog ablak. Ez a felelős a megrendelések felviteléért és a módosításáért is. Most még különösebb dizájn nélkül így néz ki:

orderdetailsdialog.jpg

Haladjunk felülről lefelé.

Sorszám: Ez egy JLabel idValueLabel, ami új megrendelés hozzáadásakor üres, mert az adatbázisba mentéskor az ID auto incrementre van állítva, és így az adatbáziskezelő rendszer osztja ki az új sorszámokat. Ha módosítok egy már meglévő megrendelést, akkor ide olvasom be az adatbázisból a megrendelést azonosítóját, az ID-t.

Ügyfél neve: Ez egy lehulló menü JComboBox customerNameComboBox, amibe beletöltöm az ügyfelek nevét.

Cég neve: Egy másik JComboBox companyNameComboBox, amelyben ki lehet választani, hogy melyik cégünk kapta a megrendelést.

Megrendelés tárgya: Itt csak simán elnevezem valaminek a megrendelést, pl. Babakocsi leírás. JTextField orderNameField.

Mennyiség: mekkora mennyiséget rendeltek, pl. 3000. JTextField quantityField.

Egység: tiszta sor, pl. karakter. JTextField unitField

Egységár: a megadott mennyiség egységára. JTextField unitPriceField

Áfa: Egy JComboBox vatComboBox, melybe beletöltöm az áfák listáját.

Megrendelés dátuma: JXDatePicker orderdateDatePicker

Író: JComboBox employeeComboBox ahova betöltöm a dolgozóink listáját.

Író egységára: Ide betöltöm az Employee adattáblában lévő megfelelő író egységárát, amit át lehet írni. Bár az írónak lesz egy alapértelmezett egységára (vállalási ára) az adatbázisban, ez folyamatosan változhat, így a megrendelés mindig eltárolja a megrendelés rögzítésekor érvényes vállalási árat. Ezt kiolvasom az űrlap megjelenítésekor az adatbázisból, de át is lehet írni, amire szeretném.

Író munkabére: itt egyszerűen kiszámoljuk a mennyiség * író egységárát. Nem tárolom adatbázisban. JTextField rateField

Nyereség: megint egyszerű számítás, nyereség = mennyiség * egységár – író munkabére. Ezt sem tárolom adatbázisban, pusztán pszichológiai oka van, kiírom a megrendelés rögzítésekor, hogy mennyit kell fizetni az írónak, és mennyi a nyereség. JLabel profitAmountLabel

Állapot: itt a már korábbiak alapján többféle állapota lehet egy megrendelésnek, 0 megrendelve, 1 elkészítve és még néhány. JComboBox statusComboBox

Kifizetés dátuma: ennek nyilván akkor van igazán értelme, ha már kész megrendelést viszek fel, vagy egy meglévőt kifizetnek, és én módosítom. JXDatePicker paiddateDatePicker

JComboBox feltöltése adattal

A JComboBox alapértelmezésként Stringet vár, de ha van listánk, nagyon könnyen fel lehet tölteni adatokkal. Erre szolgál az addItem(String), és ha van egy Vat objektumom, abból mondjuk lekérhetem a nevet a getAbbr() metódussal. Ezt szépen meg is oldottam, és feltöltöttem az áfá neveket a listába. Ezek közül már ki is lehetett választani a lehulló menüben a megfelelőt, de amikor lekértem a választott elemet a getSelectedItem metódussal, csak egy Stringet kaptam vissza. A nevek nem feltétlenül egyediek, így a visszakapott Stringgel nem tudtam adatbázisműveleteket végezni.

Segítségek kértem a Programozók Facebook csoportban, és ott mondták, hogy az addItem metódussal ne String értékeket adjak át a JComboBox-nak, hanem magát a Vat objektumokat.

Ehhez a NetBeans szerkesztőjében jobb gombbal rákattintottam a vatComboBox lehulló menüre, és a Properties lehetőséget választottam. Itt rámentem a Code fülre, és a Type paramters-nél a <String> értéket kicseréltem <Vat> értékre. Ezzel a kódban megváltozott a változók deklarációja,

private javax.swing.JComboBox<String> vatComboBox;

helyett

private javax.swing.JComboBox<Vat> vatComboBox;

lett.

A megfelelő osztály meghívásával visszakaptam egy List<Vat> vats listát, mely az adatbázisból kiolvasott áfa objektumokat tartalmazta. Ezt a listát végig iterálva hozzáadtam az egyes Vat objektumokat a vatComboBox-hoz:

vats = getAllVats();
for (Vat vat : vats) {
   vatComboBox.addItem(vat);
}

Ekkor elindítva a szoftvert, a vatComboBox lehulló menüje az objektumokat mutatta, így:

vat_objektumok.jpg

És itt segítettek a Programozó Facebook csoportban, eszméletlen, hogy este fél 11-kor is érkezik válasz. A JComboBox a toString metódust használja a lehulló menü összeállítására, így nekem ezt felül kellett írnom, hogy valamilyen szebb eredményt kapjak.

Megnyitottam a Vat osztályomat, és ott csináltam egy saját toString metódust, amiben én az áfa nevét és értékét íratom ki. Így:

@Override
public String toString() {
   return abbr + " (" + value + "%)";
}

Lefuttatva a szoftverem, már ilyen szépen formázott áfa listát kaptam a vatComboBox-ban:

vat_ertekek.jpg

Ha most a hülye Áfa neveket nem nézzük, akkor látható, hogy jó lett a megoldás. Ott az Áfa neve (vat.getAbbr()), mögötte egy space és egy nyitó zárójel, majd jön az Áfa értéke (vat.getValue()), ezt követi a % jel és a záró zárójel.

Megfelelő érték kiolvasása a JComboBox-ból

Na az egész JComboBox-nak csak akkor van értelme, ha a felhasználó által kiválasztott adatokat ki is tudom nyerni, és azzal majd elmenteni a megrendelést az adatbázisba.

Korábban ezzel nem volt gond, mert míg a ComboBox String-et használt, a getSelectedItem visszaadott egy Stringet. De én most Vat objektumokkal töltöttem fel, akkor használjuk is ki, hogy ezt tudjuk elkérni tőle:

Vat returned = (Vat) vatComboBox.getSelectedItem();
System.out.println("A kiválasztott Áfa neve: " + returned.getAbbr() + ", és értéke: " + returned.getValue());

Megnézve a getSelectedItem() metódust, a NetBeans azt mutatta, hogy Object típusú objektumot ad vissza. Azt már megtanultam, hogy ilyenkor mindig kasztolni kell, ezért az Object-ból csináltam egy Vat típusú objektumot. Ez lett a returned.

Amint pedig már Vat típusú lett, tudtam használni az általam megírt metódusokat. a getAbbr() ugye a nevét kérte le, a getValue() pedig az értékét. Így a kiíratás eredménye:

A kiválasztott Áfa neve: BRE, és értéke: 21.0

Persze ennek így nincs sok értelme, csak teszteltem, és működött. Aminek viszont van értelme, hogy le tudom kérni a kiválasztott Áfa ID-jét, és ezt mentem majd a megrendeléssel együtt az adatbázisba.

Ugyanez a feladat a többi JComboBox-nál is, így a megrendeléssel el tudom menteni a megrendelő, a cégem, az áfa és az író ID-jét az adatbázisba.

Összegzés

Na ez egy érdekes probléma volt, több dolgot is megtanultam:

  • JComboBox feltöltése List-ből
  • JComboBox feltöltése saját típusú objektumokkal
  • JComboBox lekérdezése
  • toString metódus készítése, felülírás

És ezekhez az alapokat mind a StudiCore Java képzése adta meg, az internet meg ott van, csak használni kell. Akkor linkelem is a felhasznált dolgokat: