Java Programozás 2. Gy: EmpProgram Grafikus felületű adatkezelő program 110/1 B ITv: MAN 2019.04.26
EmpProgram A programosztály A cél: olyan grafikus felületű program elkészítése, mellyel a következő szerkezetű adatsor kezelhető: Kód, név, születési idő, lakóhely, iq A megvalósítandó műveletek: Adatok tárolása (írás, olvasás) különböző típusú fájlokban: Most csak sima szövegfájlban Adatok beszúrása Listázás Adatok módosítása Adatok törlése 110/2
A projekt létrehozása File \ New \ Java project Name: LevJprogGyak 110/3
EmpProgram A projekten állva: Fájl\New\Swing\JFrame 110/4
Layout (elrendezés) beállítása Váltsunk Design felületre! Helyi menüből (jobb klikk) adjuk ki a parancsot: Set Layout \ Absolute layout Így kikapcsoljuk az elrendezés menedzselést, és minden ott fog megjelenni, ahová rakjuk! 110/5
Panel háttérszín beállítása Panel legyen kijelölve! 110/6 2x
Nyomógombok készítése Középső területen: Components \ JButton Bal oldalon: Variable: bb Bal oldalon: Properties \ text: Betöltés Ezután duplán kattintsunk a Betöltés gombra, így az Eclipse hozzáad egy akciókezelőt a gomb kódjához (és átvált a kódra) 110/7
Nyomógombok készítése Kódban átalakítjuk a gomb tulajdonságait! Itt is át lehet írni az adatokat (változónév, elhelyezkedés, méret, de egyszerűbb a Design nézeten!) 110/8 Dizájn felület Futtatási felület
Nyomógombok készítése másolással 1. Váltsunk Design nézetre 2. Kijelöljük a meglévő (beállított) gombot, és Ctrl + C 3. Ezután Ctrl + V, és a megfelelő helyre rakjuk a gombot 4. Beállítjuk a tulajdonságait (Properties) Legördítve szerkeszthető 110/9
Nyomógombok készítése másolással 1. Bezár gomb létrehozása másolással, beállítása panelen 2. Eseménykezelő hozzáadása: 1. Jobb klikk a gombra 2. Add event handler \ action \ actionperformed Egyszerűbb duplán kattintani! 3. Kódban beírni: System.exit(0); 110/10 bz.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { System.exit(0); );
Feliratok elkészítése JLabel hozzáadása, beállítása A másodikat egyszerűbb másolni! 110/11
Legördíthető lista elkészítése JComboBox elem hozzáadása a panelhez Változó nevének módosítása (jcbf) 110/12
Legördíthető lista elemek hozzáadása Kódban módosítások: String elem[] = {"Válasszon!","Helyi.dat fájl", "Helyi.xml fájl","helyi.csv fájl","sqlite DB", "Web: JSON fájl"; JComboBox jcbf = new JComboBox(); for (String s: elem) jcbf.additem(s); Kipróbálás: Meglévő kódsor 110/13 Futtatási felület
Szövegmezők hozzáadása Dizájn felületen: 110/14
Szövegmezők hozzáadása Dizájn felületen: 110/15
Legördíthető lista események kezelése Dizájn felületen módosítás: Kódban: private String forras="válasszon!"; 110/16 Eseménykezelő hozzáadása: 1. Jobb klikk a JComboBox-ra 2. Add event handler \ action \ actionperformed JComboBox jcbf = new JComboBox(); for (String s: elem) jcbf.additem(s); jcbf.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { forras = (String)jcbf.getSelectedItem(); ); fnev.settext(forras); fdb.settext("4"); Meglévő kódsorok Kipróbálás, tesztelés miatt! Rövidesen módosítjuk!
Legördíthető lista próba Futtassuk a programot: Futtatási felület 110/17
Hozzuk létre az Emp.csv fájlt Bárhol lehet a fájlrendszerben! Olyan szövegfájl, mely első sorában tartalmazza a mezők nevét, ezután soronként az adatokat, pontosvesszővel elválasztva! Jobb klikk egy mappában \ Új \ Szöveges dokumentum Adjuk meg a nevét: Emp.csv Íjuk be az adatokat, mentsük le! 110/18
Magyarázatok Programlogika: 1. Kiválasztjuk a forrást 2. A Betöltés gombra kattintva megjelenik egy fájlválasztó panel A panelen csak olyan kiterjesztésű fájlt választhatunk ki, amilyen a kiválasztott forrás típusa! 3. Válasszunk ki a panelen egy fájlt 4. A kiválasztott fájl neve íródjon ki a forrás melletti mezőbe 5. Olvassuk be az adatokat, és írjuk ki a számukat 110/19
Betöltés eseménykezelő hozzáadása Design felületen kattintsunk duplán a Betöltés gombra, aztán módosítsuk a kódot: JButton bb= new JButton("Bet\u00F6lt\u00E9s"); bb.addactionlistener(new ActionListener() { public void actionperformed(actionevent arg0) { if (forras.equals("helyi.csv fájl")) { FileDialog példányosítása FileDialog fd = new FileDialog(new Frame(), " ", FileDialog.LOAD); ); 110/20 Csak.csv fájlok jelenjenek meg fd.setfile("*.csv"); fd.setvisible(true); FileDialog láthatóvá tétele if (fd.getfile()!= null) { fbe = new File(fd.getDirectory(), fd.getfile()); String befnev = fd.getfile(); fnev.settext(befnev); Könyvtár és fájlnév, együtt a fájl! Importok szükségesek a FileDialog és a File miatt, és kell az fbe változó deklarációja is!
Betöltés csv esemény kódja Szükséges importok, változók: import java.io.*; import java.awt.*; private File fbe; 3 2 1 5 FileDialog panel 110/21 7 4 6
Kis kitérő: DataManager osztály Készítsünk egy olyan metódust, amivel üzenetpanelt tudunk megjeleníteni. A metódus neve legyen SMD, paraméterei: megjelenítendő üzenet, ikon típusa (int). A metódus a DataManager osztályba kerüljön, így ebből bármikor meghívható bármelyik osztályból import javax.swing.joptionpane; public class DataManager { public void SMD(String mes, int type) { JOptionPane.showMessageDialog(null, mes, "EmpProgram üzenet", type); 110/22
További módosítások Szükséges deklaráció: private DataManager DM = new DataManager(); Ha nincs kiválasztva forrás, a Betöltés megnyomása dobjon hibaüzenetet: JButton bb= new JButton("Bet\u00F6lt\u00E9s"); bb.addactionlistener(new ActionListener() { public void actionperformed(actionevent arg0) { if (forras.equals("válasszon!")) DM.SMD("Először válassza ki a Forrás-t!", 0); ); if (forras.equals("helyi.csv fájl")) {... 110/23 0 1 2 3
További módosítások Hiányzott valamilyen import, ezen berágtam, és a meglévő összes importot kitöröltem, és helyettesítettem a következővel: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; Egy hibás sor maradt, valamilyen EmptyBorder. Mondtam kétszer az Eklipsznek, hogy ha akarja, javítsa ki, de nem akarta. Így ezt a sort kitöröltem! Nem haragszom az Eklipszre, csak azt érezteti velem, hogy felsőbb rendű mint én, és ezt nem szeretem! 110/24
Próba Nekem működik a kód! 110/25
Lista panel kialakítás a panel létrehozása 110/26
A feladat Feladat: folytassuk a panel életre keltését! - Alakítsuk ki a Lista panelt - Betöltéskor olvassuk be az adatokat a fájlból, és írjuk ki az adatsorok számát 110/27
Lista panel kialakítás tábla modell létrehozása A táblázat kezelése egy táblamodellel kezdődik. A modellben lehet megadni az egyes mezők típusát és szerkeszthetőségét. A DefaultTableModel leszármaztatásával jön létre, konstruktorában kapja meg a mezőneveket, és az oszlopok számát. Programlogika: 1. Egy modellt használnánk csak a programban az egyszerűség miatt 2. A módosításnál és a törlésnél ki kell jelölni egy rekordot, így szükséges egy jelölhető (logikai típusú) mező a sor elejére 3. A mezők típusa rendre: logikai, egész, szöveg, szöveg, szöveg, egész 3. Csak a legelső (logikai) mezőnek kell szerkeszthetőnek lennie (a kijelölhetőség miatt!) 110/28
Lista panel kialakítás tábla modell létrehozása File \ New \ Class - Neve legyen: EmpTM 110/29
Lista panel kialakítás tábla modell létrehozása import javax.swing.table.defaulttablemodel; public class EmpTM extends DefaultTableModel { public EmpTM (Object fildnames[], int rows){ super(fildnames, rows); 110/30 Zöld: kötelező rész, minden táblamodellben egyforma! Konstruktor: megkapja a mezők nevét és a sorok számát. public boolean iscelleditable(int row, int col) { if (col == 0) {return true; return false; Szerkeszthetőség: a 0. oszlop minden sora szerkeszthető, a többi cella nem! public Class<?> getcolumnclass(int index){ if (index == 0) return(boolean.class); else if (index==1 index==5) return(integer.class); return(string.class); Oszlopok típusa: a 0. oszlop logikai, az 1. és az 5. egész, a többi szöveges!
Lista panel kialakítás a panel létrehozása New \ Swing \ JDialog Vegyük ki a pipát! Utólag törölhető a panel, ha mégis marad a pipa! 110/31
Lista panel kialakítás a panel létrehozása Vegyük szélesebbre az ablakot 110/32
Lista panel kialakítás a panel létrehozása Kapcsoljuk ki az elrendezés menedzselését! 110/33
Lista panel kialakítás a panel létrehozása Hozzuk létre a Bezár nyomógombot 110/34
Lista panel kialakítás a panel létrehozása Adjunk a panelhez egy JTable-t. 110/35
Lista panel kialakítás a panel létrehozása Adjunk a JTable-höz egy JScrollPane-t (görgetősávok) 1 3 2 110/36
Lista panel kialakítás a panel létrehozása Futtassuk a kódot, nézzük meg a panelt! 110/37
Lista panel kialakítás a panel létrehozása Kódbűvölés következik! Az osztály elejére: private EmpTM etm; A JTable kódjába: A kódból töröljük a main függvényt! table = new JTable(etm); A táblázatban az etm modell fog megjelenni Nem lesz önállóan futtatható a panel, ezért nem kell bele a main függvény! 110/38
Lista panel kialakítás a panel létrehozása Alakítsuk át a konstruktor elejét: public EmpList(JFrame f, EmpTM betm) { super(f, "Dolgozók listája", true); etm = betm; Tulajdonos, ablak címe, modális jelző A konstruktor kódjának végére írjuk be a következőket: Modális ablak lesz, melyet be kell zárni ahhoz, hogy az alatta lévő ablak újra aktív legyen! TableColumn tc = null; for (int i = 0; i < 6; i++) { tc = table.getcolumnmodel().getcolumn(i); if (i==0 i==1 i==5) tc.setpreferredwidth(30); else {tc.setpreferredwidth(100); 110/39 30 30 100 100 100 30 Oszlopszélesség megadása: a teljes szélességet felosztja az itt megadott értékek arányában!
Lista panel kialakítás a panel létrehozása A konstruktor kódjának végére írjuk be a következőket: table.setautocreaterowsorter(true); AutoSorter bekapcsolása TableRowSorter<EmpTM> trs = (TableRowSorter<EmpTM>)table.getRowSorter(); trs.setsortable(0, false); A 0. oszlop rendezhetőségének letiltása 110/40
Lista panel kialakítás a panel bezárása Kattintsunk duplán a Bezár gombon Dizájn nézetben, így az Eklipsz hozzáad egy eseménykezelőt a gombhoz, és megnyitja a kódot! Írjuk be a Bezár gomb kódját: JButton btnnewbutton = new JButton("Bez\u00E1r"); btnnewbutton.addactionlistener(new ActionListener() { public void actionperformed(actionevent arg0) { dispose(); setvisible(false); ); dispose(): eltűnik a képernyőről a panel, de a referenciái megmaradnak. 110/41 setvisible(false): eltűnik a képernyőről a panel, de a referenciái megmaradnak. A két utasítás hatása ugyanaz, elég az egyiket használni!
A Lista panel megjelenítése (az EmpProgramban) Kódok beszúrása: Az osztály elejére: private EmpTM etm; A Lista gomb kódja: JButton bl = new JButton("Lista"); bl.addactionlistener(new ActionListener() { public void actionperformed(actionevent arg0) { EmpList el = new EmpList(EmpProgram.this, etm); el.setvisible(true); Megjelenítés ); Példányosítás A konstruktor végére: Mezőnevek megadása Object emptmn[] = {"Jel","Kód","Név","Szülidő","Lakóhely","IQ"; etm = new EmpTM(emptmn, 0); etm példányosítása: mezőnevekkel, 0 darab sorral 110/42
A Lista panel kipróbálása (az EmpProgramban) 110/43
Adatok beolvasása csv fájlból Programlogika: 1. Egy külön osztályba tegyük a fájlkezelő rutinokat (FileManager) 2. A rutin megkapja a beolvasandó fájl nevét, és a táblamodell nevét 3. Beolvassa az adatokat, soronként hozzáadja a táblamodellhez, és visszaadja a táblamodellt Létrehozása: File \ New \ Class Név: FileManager 110/44
Adatok beolvasása csv fájlból import java.io.*; import javax.swing.joptionpane; 3/1 public class FileManager { private DataManager DM = new DataManager(); public static void CsvReader(File fnev, EmpTM etm) { try { BufferedReader in = new BufferedReader(new FileReader(fnev)); BufferedReader: pufferelt szövegolvasó. A fájlból egyszerre max. 1024 kb-ot olvas be a memóriába, és onnan lehet soronként kiolvasni az adatokat. 110/45
Adatok beolvasása csv fájlból String s=in.readline(); //=== mezőnevek az első sorból 3/2 s=in.readline(); //=== adatsor while(s!=null) { String[] st = s.split(";"); etm.addrow(new Object[]{false, StoI(st[0]), st[1], st[2], st[3], StoI(st[4])); s=in.readline(); addrow: sor hozzáadása a táblamodellhez in.close(); DM.SMD("Adatok beolvasva!", 1); catch (IOException ioe) { DM.SMD("CsvReader: "+ioe.getmessage(), 0); 110/46 s 21;Kő Éva;1999.12.21;Miskolc;118 st 21 s.split(";"); Kő Éva 1999.12.21 Miskolc 118
Adatok beolvasása csv fájlból public static int StoI(String s){ int x=-55; x = Integer.parseInt(s); return x; 3/3 110/47
Betöltés a.csv olvasás életre keltése A Betöltés gomb kódja az EmpProgram osztályban JButton bb= new JButton("Bet\u00F6lt\u00E9s"); bb.addactionlistener(new ActionListener() { public void actionperformed(actionevent arg0) { if (forras.equals("helyi.csv fájl")) { FileDialog fd = new FileDialog(new Frame(), " ", FileDialog.LOAD); ); 110/48 fd.setfile("*.csv"); A meglévő kód fd.setvisible(true); if (fd.getfile()!= null) { fbe = new File(fd.getDirectory(), fd.getfile()); String befnev = fd.getfile(); fnev.settext(befnev); FileManager.CsvReader(fbe, etm); Kék: új kódrészek fdb.settext(""+etm.getrowcount());
Lista panel kialakítás a panel kipróbálása Ha mindent jól csináltunk, a program betölti és megjeleníti a csv fájlok tartalmát: 1 5 2 3 6 4 110/49
Lista panel kialakítás a panel létrehozása 110/50
A feladat Feladat: folytassuk a panel életre keltését! - Alakítsuk ki az Új dolgozó felvitele panelt - A panel a Beszúr gomb megnyomásakor ellenőrizze az adatokat - Az adatok a Beszúr hatására adódjanak hozzá a táblázathoz, melyben tároljuk azokat. 110/51
Új dolgozó panel New \ Swing \ JDialog Vegyük ki a pipát! 110/52
Új dolgozó panel 1. Absolute layout beállítása 2. Háttérszín beállítása: Named colors\lightness\paleturquoise 3. 1 felirat (Kód:) és 1 szövegmező felpakolása 1. A JTextField változónevének megadása: kod 4. Felirat + szövegmező kijelölése, másolása, 110/53 beillesztése Ctrl + V 6. Felirat átírása, a szövegmező változónevének beállítása (nev) 7. 5+6 ismétlése (változók: szid, lak, iq) 8. Nyomógombok felpakolása (másolással) 9. Kód mező ne legyen szerkeszthető: 10. Ablak felirata: Ctrl 11. Futassuk a kódot, nézzük meg az eredményt! Ctrl + C
Új dolgozó panel Programlogika: 1. Legyen ez az ablak is modális. 2. A Lekér gomb jelenítse meg a rekord kódját. A legnagyobb létező kódot (maxkod) az EmpProgramtól kapja meg, ettől legyen eggyel nagyobb a rekord kódja. 3. A Beszúr gomb megnyomásakor a program ellenőrizze le: ki vannak-e töltve a mezők, (filled), a születési idő dátum-e, (gooddate) az iq mezőben egész szám van-e (goodint)! ezek a metódusok a DataManager osztályba kerüljenek! 4. Ha megfelelőek az adatok a mezőkben, a Beszúr gomb megnyomásakor állítson elő a panel egy Emp típusú változót, ez egy metódussal (getemp) lekérhető legyen a paneltől, és a panel lekérdezhető visszatérő (getkilep) értéke legyen 1, míg sima bezáráskor a visszatérő érték legyen 0. 110/54
Új dolgozó panel Kódok beszúrása: A konstruktorba: Lehet, hogy kell: public EmpNew(JFrame f, int maxkod) { super(f, true); settitle("\u00daj dolgoz\u00f3 felvitele"); import javax.swing.jframe; Lekér gombhoz: btnlekr.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { kod.settext(""+(maxkod+1)); ); 110/55
A DataManager osztály bővítése Kódok beszúrása: Új metódusok a DataManager osztályba: public String RF(JTextField a) { return a.gettext().tostring(); String beolvasása szövegmezőből public boolean filled(jtextfield a) { Van adat a mezőben? String s = RF(a); if (s.length() > 0) return true; else return false; public boolean gooddate(jtextfield a) { Helyes a dátum? String s = RF(a); Date testdate = null; try { sdf: yyyy.mm.dd alakú dátumforma testdate = sdf.parse(s); catch (ParseException e){return false; if (sdf.format(testdate).equals(s)) return true; else return false; 110/56
A DataManager osztály bővítése Kódok beszúrása: Új metódusok a DataManager osztályba: public boolean goodint(jtextfield a) { Helyes az egész szám? String s = RF(a); try { Integer.parseInt(s); return true; catch (NumberFormatException e){return false; Szükséges importok: import java.util.date; import java.text.simpledateformat; import java.text.parseexception; Szükséges deklaráció: private SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd"); 110/57
Új dolgozó panel: EmpNew Szükséges deklaráció: private DataManager DM = new DataManager(); A Beszúr gomb kódja: btnbeszr.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { if (!DM.filled(kod)) kod.settext(""+(maxkod+1)); if (!DM.filled(nev)) DM.SMD("A Név mező üres!", 0); else if (!DM.filled(szid)) DM.SMD("A Születési idő mező üres!", 0); else if (!DM.goodDate(szid)) DM.SMD("A Születési idő mezőben hibás adat van!", 0); else if (!DM.filled(lak)) DM.SMD("A Lakóhely mező üres!", 0); else if (!DM.filled(iq)) DM.SMD("Az IQ mező üres!", 0); else if (!DM.goodInt(iq)) DM.SMD("Az IQ mezőben hibás adat van!",0); ); 110/58
Új dolgozó panel Kipróbálás: a main függvényben ideiglenesen javítsuk ki a példányosítás kódját EmpNew dialog = new EmpNew(null, 52); 110/59
A DataManager osztály bővítése Ha minden adat rendben, állítsunk elő egy Emp típusú változót az adatokból. Ehhez készítenünk kell egy Emp típust, és két újabb metódus is szükséges a DataManager osztályba: public Date StoD(String s){ Date testdate = null, vid = null; Stringből dátum try { testdate = sdf.parse(s); catch (ParseException e) {return vid; if (!sdf.format(testdate).equals(s)){return vid; return testdate; public int StoI(String s){ int x=-55; x = Integer.parseInt(s); return x; 110/60 Stringből Integer
Az Emp típus elkészítése File \ New \ Class A típus.dat fájlba írásához szükséges, hogy sorosítható legyen! 1 3 4 2x 2 110/61 6 5
Az Emp típus kódja import java.io.serializable; public class Emp implements Serializable { private int kod; private String nev; private Date szulido; private String lakohely; private int iq; A Date típusra hibát kapunk. Megoldás: jobbklikk a Date-re \ Source \ Add import. A panelen válasszuk a java.util.date-et. 110/62
Az Emp típus kódja Konstruktor létrehozása A konstruktor létrehozása: Jobbklikk az üres háttérre \ Source \ Generate Constructor using fields 110/63
Az Emp típus kódja Getter metódusok hozzáadása: Jobbklikk az adattagok területére \ Source \ Generate Getters and Setters 110/64
Az Emp típus teljes kódja import java.io.serializable; import java.util.date; 2/1 public class Emp implements Serializable { private int kod; private String nev; private Date szulido; private String lakohely; private int iq; Adattagok public Emp(int kod, String nev, Date szulido, String lakohely, int iq){ this.kod = kod; this.nev = nev; this.szulido = szulido; this.lakohely = lakohely; Konstruktor this.iq = iq; 110/65
Az Emp típus kódja public int getkod(){ return kod; public String getnev(){ return nev; public Date getszulido(){ return szulido; public String getlakohely(){ return lakohely; public int getiq(){ return iq; Getter metódusok 2/2 110/66
Új dolgozó panel: EmpNew A Beszúr gomb kódjának folytatása: private Emp adat; private int kilep=0; btnbeszr.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) {... else if (!DM.filled(iq)) DM.SMD("Az IQ mező üres!", 0); else if (!DM.goodInt(iq)) DM.SMD("Az IQ mezőben hibás adat van!", 0); else { adat = new Emp(DM.StoI(DM.RF(kod)), DM.RF(nev) DM.StoD(DM.RF(szid)), DM.RF(lak), DM.StoI(DM.RF(iq))); DM.SMD("Adat beszúrva!", 1); kilep=1; dispose(); setvisible(false); ); 110/67
Új dolgozó panel: EmpNew Már csak két metódus szükséges, amikkel ki tudjuk olvasni a panel adatait (az osztály végére kerüljenek) public Emp getemp(){ return adat; public int KiLep() { return kilep; A panel Bezár gombjának kódja: btnbezr.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { dispose(); ); 110/68
Új dolgozó panel Töröljük ki a main függvényt a kódból: 110/69
Az Új dolgozó panel beépítése Programlogika- az Új dolgozó panel beépítése: 1. Az EmpProgram ablakban hozzunk létre egy Új adat nyomógombot 2. A gombot megnyomva jelenjen meg a panel, ekkor adjuk át a panelnek a legutolsó rekord kódját. Ha nincs egyetlen adat sem, a kód induljon 21-ről! (mert csak!) 3. Ha a bezárás ikonnal, vagy a Bezár gombbal bezárjuk a panelt, ne történjen semmi sem 4. Ha a Beszúr gombot megnyomjuk a panelen, akkor olvassuk ki a panelről az új adatsort, és adjuk hozzá az adatokat nyilvántartó táblázathoz Növeljük az adatsorok számát! 110/70
Az EmpProgram panel módosítása Másoljuk le a Lista gombot, módosítsuk az adatait: Írjuk át a változó nevét: ujadat-ra Írjuk át a feliratát: Új adat-ra Kattintsunk rá duplán (akciókezelő hozzáadása), és adjuk meg a működését Ctrl Ctrl + + C V 110/71
Az EmpProgram módosítása A dátum kezeléséhez szükség lesz a Date osztályra, a formázásához a SimpleDateFormat osztályra: import java.util.date; import java.text.simpledateformat; A magyar dátumforma kezeléséhez szükség lesz egy dátumformátum változóra: private SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd"); 110/72
Az EmpProgram módosítása ujadat.addactionlistener(new ActionListener() { public void actionperformed(actionevent arg0) { ); 110/73 int kodv=0; if (etm.getrowcount()==0) kodv=20; else kodv=(int)etm.getvalueat(etm.getrowcount()-1, 1); EmpNew en = new EmpNew(EmpProgram.this, kodv); en.setvisible(true); int kilep = en.kilep(); if (kilep==1) { Emp newemp = en.getemp(); Adat kiolvasása az Új adat panelről Date d = newemp.getszulido(); String ddd = sdf.format(d).tostring(); etm.addrow(new Object[]{new Boolean(false), newemp.getkod(), newemp.getnev(), ddd, newemp.getlakohely(), newemp.getiq()); fdb.settext(""+etm.getrowcount()); Ha nincs adat, a kód értéke legyen 20, egyébként a táblázatban lévő utolsó adatsorban lévő kód értéke. tm.getvalueat(row, column)
Az Új adat funkció kipróbálása 4 1 2 6 5 3 110/74 7
Lista panel kialakítás a panel létrehozása 110/75
A feladat Feladat: folytassuk a panel életre keltését! - Készítsük el az adatok kiírási funkcióját: - Először a Célt kell kiválasztani, - aztán megadni a kimeneti fájl nevét, - végül megnyomni a Kiírás gombot. - >>> Forrás: extra funkció, visszaírás oda, ahonnan betöltöttük az adatokat 110/76
Az EmpProgram panel módosítása Másolással készítsük el a gombokat: Módosítás Törlés Kiírás Variable modosit torol kiir Text Módosítás Törlés Kiírás Készítsük el a Cél: feliratot Másolással készítsük el a legördíthető listát, Var: jcbc Másolással készítsük el a szövegmezőt, Var: kifnev Adjunk hozzá eseménykezelőt a jcbc nevű legördíthető listához: 1. Jobb klikk a JComboBox-ra 2. Add event handler \ action \ actionperformed 110/77
Az EmpProgram kódjának módosítása A célterület kezeléséhez szükség lesz egy változóra, ebben lesz mindig a kiválasztott cél értéke: private String cel="válasszon!"; A legördülő lista (jcbc) kódja: String elem2[] = {"Válasszon!",">>> Forrás","Helyi.dat fájl", "Helyi.xml fájl","helyi.csv fájl","helyi.json fájl", "Helyi.pdf fájl","sqlite DB"; JComboBox jcbc = new JComboBox(); for (String s: elem2) jcbc.additem(s); jcbc.addactionlistener(new ActionListener() { public void actionperformed(actionevent arg0) { cel = (String)jcbc.getSelectedItem(); ); 110/78
Az EmpProgram kódjának módosítása A Dizájn felületen kattintsunk duplán a Kiírás gombra A kódot egészítsük ki: JButton kiir = new JButton("Ki\u00EDr\u00E1s"); kiir.addactionlistener(new ActionListener() { public void actionperformed(actionevent arg0) { if (cel.equals("válasszon!")) DM.SMD("Először válassza ki a Cél-t!", 0); else if (etm.getrowcount()==0) DM.SMD("Nincs kiírható adat", 0); else if (cel.equals("helyi.csv fájl")) { if (kifnev.gettext().length()==0) DM.SMD("Nincs megadva a cél fájl neve!", 0); else { FM.CsvWriter(kifnev.getText().toString(), etm); ); 110/79
Adatok kiírása csv fájlba Programlogika: 1. A rutin megkapja a kiírandó fájl nevét, és az adatokat tartalmazó táblamodell nevét 1. Kiírja a mezők nevét 2. Két egymásba ágyazott ciklussal végigmegy az adatokon, és kiírja őket a fájlba j etm.getcolumncount() i 110/80 etm.getrowcount()
Adatok kiírása csv fájlba (FileManager bővítése) public void CsvWriter(String fnev, EmpTM etm) { try { PrintStream out = new PrintStream(new FileOutputStream(fnev)); out.println("kód;név;szülidő;lakóhely;iq"); int rdb = etm.getrowcount(); int cdb = etm.getcolumncount(); for (int i=0; i < rdb; i++) { for (int j=1; j < cdb-1; j++) { out.print(""+etm.getvalueat(i,j)+";"); out.println(""+etm.getvalueat(i, cdb-1)); out.close(); DM.SMD("Adatok kiírva!", 1); catch (IOException ioe) { DM.SMD("CsvWriter: "+ioe.getmessage(), 0); 110/81
A Kiírás funkció kipróbálása 1 2 3 5 4 110/82
A kiírt adat visszaolvasása 3 C:\Users\bitman\workspace\EmpOrai\prb.csv 2 1 5 4 6 110/83
A Cél: >>> Forrás funkció (visszaírás a forrásba) Programlogika: 1. Ha kiválasztjuk ezt az opciót, és nincs kiválasztva Forrás, dobjunk hibaüzenetet! 2. Ha kiválasztjuk ezt az opciót, és van kiválasztva Forrás, írjuk ki a forrás nevét a Cél: mezőbe! 3. Ha megnyomjuk a Kiírás gombot, és ez az opció ki van választva, be kell azonosítani a Forrás típusát, nevét, és ennek megfelelően kell kiírni az adatokat! A legördülő lista (jcbc) kódjának módosítása: jcbc.addactionlistener(new ActionListener() { public void actionperformed(actionevent arg0) { cel = (String)jcbc.getSelectedItem(); if (cel.equals(">>> Forrás") && fnev.gettext().equals("")) DM.SMD("Nincs megadva a Forrás!"); if (cel.equals(">>> Forrás") &&!fnev.gettext().equals("")) kifnev.settext(fnev.gettext()); ); 110/84
A Cél: >>> Forrás funkció (visszaírás a forrásba) A kiir gomb kódjának módosítása: JButton kiir = new JButton("Ki\u00EDr\u00E1s"); kiir.addactionlistener(new ActionListener() { public void actionperformed(actionevent arg0) { if (cel.equals("válasszon!")) SMD("Először válassza ki a Cél-t!"); else if (etm.getrowcount()==0) SMD("Nincs kiírható adat"); else if (cel.equals("helyi.csv fájl")) { if (kifnev.gettext().length()==0) SMD("Nincs megadva a cél fájl neve!"); else { FileManager.CsvWriter(kifnev.getText().toString(), etm); else if (cel.equals(">>> Forrás") && forras.equals("helyi.csv fájl")){ String kiirfnev = fnev.gettext(); kifnev.settext(kiirfnev); FM.CsvWriter(kiirfnev, etm); ); 110/85
Lista panel kialakítás a panel létrehozása 110/86
A feladat Feladat: folytassuk az EmpProgram panel életre keltését! - Készítsük el a Módosítás funkciót - A Lista panelt másoljuk le, és bővítsük a szükséges mezőkkel - A Módosít gomb megnyomásakor az adott mezőkbe írt adatok módosuljanak a kijelölt rekordban 110/87
Az EmpList panel lemásolása Álljunk rá a projektünkben az EmpList osztály nevére, és másoljuk le az osztályt. Ctrl + C Ctrl + V A megjelenő panelen adjuk meg az új osztály nevét: EmpMod 110/88
Az EmpMod ideiglenes átalakítása Az EmpMod panel nem futtatható, így nagyon nehéz a grafikus felületen módosításokat végezni, ezért ideiglenesen alakítsuk át futtathatóra: Az EmpProgramból másoljuk át a main függvényt, és alakítsuk át, hogy ezt a panelt indítsa! A paraméterként bejövő táblamodellt szüntessük meg, és helyette példányosítsuk a panelen az etm táblamodellt (a kódot az EmpProgramból másoljuk át!) Ha kész a grafikus átalakítás, ezeket a módosításokat vissza kell majd állítani! 110/89
Az EmpMod ideiglenes átalakítása private EmpTM etm; public static void main(string[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { EmpMod frame = new EmpMod(null); frame.setvisible(true); catch (Exception e) { e.printstacktrace(); ); Ideiglenes main függvény, benne az átalakított EmpMod példányosítás Kommentben az eredeti adatok, így könnyebb lesz visszaállítani őket! public EmpMod(JFrame f) { //==,EmpTm betm super(f, "Dolgozók módosítása", true); //== etm = betm; Object emptmn[] = {"Jel","Kód","Név","Szülidő","Lakóhely","IQ"; etm = new EmpTM(emptmn, 0); Ideiglenes etm példány, setbounds(100, 100, 500, 300); az EmpProgramból! 110/90
Próba - Feladat - Készítsük el a megjelölt módosításokat! 110/91
Az EmpMod panel grafikus átalakítása Ha nem jelenne meg a Design fül, akkor zárjuk be a panel kódját, és nyissuk meg a következő módon: 1. Jobb klikk az osztály nevére, a Package Explorerben 2. Open With 3. WindowBuilder Editor 2 3 1 110/92
Az EmpMod panel grafikus átalakítása Vegyük kisebbre (alacsonyabbra) a táblázatot Vegyük észre: a kód mező nem változtatható! Rakjunk fel egy szövegmezőt (JTextField) Másoljuk le a szövegmezőt, közben állítsuk be a megfelelő szélességeket! (Ciklusban: módosítok, megnézem) Állítsuk be a szövegmezők neveit: nev, szid, lakh, iq Másolással készítsük el a Módosít gombot, Var: modosit 1. változat Kész a panel 110/93
Magyarázatok Programlogika: 1. Az adatokat csak a megkapott táblamodellben módosítjuk, a végleges (perzisztens) tároláshoz később ki kell írni őket fájlba! 2. Csak egy adatsor, de annak akár az összes adata módosítható egyszerre, ebből következnek a Módosítás gomb megnyomásakor lezajló ellenőrzések. Hiba keletkezik, ha: 1. Ha nincs kitöltve egyetlen módosítandó adat sem, 2. Ha a Születési időben hibás dátum van, 3. Ha hibás szám van az IQ mezőben, 4. Ha nincs kijelölve módosítandó rekord 5. Ha több rekord van kijelölve módosításra 3. A szükséges metódusok megtalálhatók a DataManager osztályban 4. Szükségünk lesz egy szövegmezőt kiürítő metódusra, ezt írjuk meg a DataManager osztályban: 110/94 public void DF(JTextField a) { a.settext("");
Az EmpMod panel Módosítás gombjának kódja A grafikus dizájnerben kattintsunk duplán a Módosít gombra, így hozzáadunk egy eseménykezelőt, és visszajutunk a kódba. Kezdjük a kód kiegészítését. Készítsük el a Módosít gomb kódját: JButton modosit = new JButton("M\u00F3dos\u00EDt"); 2/1 modosit.addactionlistener(new ActionListener() { public void actionperformed(actionevent arg0) { if (!DM.filled(nev) &&!DM.filled(szid) &&!DM.filled(lakh) &&!DM.filled(iq)) DM.SMD("Egyetlen módosító adat sincs beírva!",0); else if (DM.filled(szid) &&!DM.goodDate(szid)) DM.SMD("A Születési idő mezőben hibás adat van!",0); else if (DM.filled(iq) &&!DM.goodInt(iq)) DM.SMD("Az IQ mezőben hibás adat van!",0); else { 110/95
); Az EmpMod panel Módosítás gombjának kódja int db=0, jel=0, x=0; 2/2 for(x = 0; x < etm.getrowcount(); x++) if ((Boolean)etm.getValueAt(x,0)) {db++; jel=x; if (db==0) DM.SMD("Nincs kijelölve a módosítandó rekord!",0); if (db>1) DM.SMD("Több rekord van kijelölve!\negyszerre csak egy rekord módosítható!",0); if (db==1) { if (DM.filled(nev)) etm.setvalueat(dm.rf(nev), jel, 2); if (DM.filled(szid)) etm.setvalueat(dm.rf(szid), jel, 3); if (DM.filled(lakh)) etm.setvalueat(dm.rf(lakh), jel, 4); if (DM.filled(iq)) etm.setvalueat(dm.rf(iq), jel, 5); DM.SMD("A rekord módosítva!",1); DM.DF(nev); DM.DF(szid); DM.DF(lakh); DM.DF(iq); etm.setvalueat(false, jel, 0); //== előző oldali else ág vége 110/96
Az EmpMod panel visszaalakítása Töröljük ki a main függvényt! Állítsuk vissza az ideiglenesen módosított sorokat! A main függvény hűlt helye public EmpMod(JFrame f, EmpTM betm) { A helyreállított konstruktor super(f, "Dolgozók módosítása", true); etm = betm; A visszaállított értékadás //Object emptmn[] = {"Jel","Kód","Név","Szülidő","Lakóhely","IQ"; //etm = new EmpTM(emptmn, 0); setbounds(100, 100, 500, 300); Töröljük a kódból az ideiglenes emp példányt! 110/97
Az EmpMod meghívása az EmpProgramból A Módosítás gomb kódja: JButton modosit = new JButton("M\u00F3dos\u00EDt\u00E1s"); modosit.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { if (etm.getrowcount()==0) DM.SMD("Nincs módosítható adat!", 0); else { EmpMod em = new EmpMod(EmpProgram.this, etm); em.setvisible(true); ); 110/98
A Módosítás funkció kipróbálása 3 1 2 9 7 4 5 110/99 8 6
Lista panel kialakítás a panel létrehozása 110/100
A feladat Feladat: folytassuk az EmpProgram panel életre keltését! - Készítsük el a Törlés funkciót - Egyszerre csak egy rekord törölhető, extra funkcióként ez átállítható - A Lista panelt másoljuk le, és azt alakítsuk át a szükséges módon 110/101
Az EmpList panel lemásolása Álljunk rá a projektünkben az EmpList osztály nevére, és másoljuk le az osztályt. Ctrl + C Ctrl + V A megjelenő panelen adjuk meg az új osztály nevét: EmpDel 110/102
Az EmpDel panel kialakítása Nyissuk meg a panelt a WindowBuilder Editor-ral! 110/103
Az EmpDel panel kialakítása (Design) Írjuk át a panel nevét, title: Dolgozók törlése Vegyük alacsonyabbra a táblázatot Rakjunk egy JCheckBox-ot a panelre Variable: jcb text: Több rekord is törölhető egyszerre Adjunk a jcb-hez akciókezelőt: \ Add event handler \ action \ actionperformed Váltsunk vissza Design nézetre, másoljuk le a Bezár gombot, írjuk át a feliratát, rakjuk a megfelelő helyre! Var: torol, text: Töröl Kattintsunk a Töröl gombra duplán (akciókezelő hozzáadása) Kész a panel, jöhet a kód módosítása 110/104
Magyarázatok Programlogika: 1. Szükségünk lesz egy változóra, ami a többes törlés funkció állapotát mutatja (md) 2. A kilépés kezelésével nem kell foglalkoznunk, mert ezen a panelen fogjuk kitörölni a táblázatból az adatokat, és mivel a panel konstruktorában szerepel az etm = betm; utasítás (a főprogramból paraméterként érkező betm, és a panelen használt etm megegyezik, vagyis a két táblamodell ugyanarra a változóra mutat), a főprogramban automatikusan módosulnak az adatok! 110/105
Az EmpDel panel kialakítása kód: A többes törlés változójának deklarálása: private boolean md=false; A DataManager példány megadása: private DataManager DM = new DataManager(); A többes törlés JCheckBox (jcb) kódja: jcb.addactionlistener(new ActionListener() { public void actionperformed(actionevent arg0) { md = jcb.isselected(); ); 110/106
Az EmpDel panel kialakítása kód: A Törlés (torol) gomb kódja: int db=0, jel=0, x=0; for(x = 0; x < etm.getrowcount(); x++) if ((Boolean)etm.getValueAt(x,0)) {db++; jel=x; if (db==0) DM.SMD("Nincs kijelölve a törlendő rekord!",0); if (!md) { if (db>1) DM.SMD("Több rekord van kijelölve!\negyszerre csak egy rekord törölhető!",0); if (db==1) { etm.removerow(jel); DM.SMD("A rekord törölve!",1); else { for (int i=0; i<etm.getrowcount(); i++) if ((Boolean)etm.getValueAt(i,0)) {etm.removerow(i); i--; DM.SMD("Rekord(ok) törölve!",1); 110/107
Az EmpDel panel beépítése az EmpProgramba Az EmpProgram-ban lévő Törlés (torol) gomb kódja: if (etm.getrowcount()==0) DM.SMD("Nincs törölhető adat!", 0); else { EmpDel ed = new EmpDel(EmpProgram.this, etm); ed.setvisible(true); fdb.settext(""+etm.getrowcount()); Kész! Próbálja ki mindenki az alkotást! 110/108
Lista panel kialakítás a panel létrehozása 110/109
VÉGE VÉGE 110/110