Java Programozás 8. Gy: Java alapok Adatkezelő 4.rész 37/1 B ITv: MAN 2018.04.15
A feladat Feladat: folytassuk a 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 37/2
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 37/3
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! 37/4
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 listája", 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, 37/5 setbounds(100, 100, 500, 300); az EmpProgramból!
Próba - Feladat - Készítsük el a megjelölt módosításokat! 37/6
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 37/7
Az EmpMod panel grafikus átalakítása Vegyük kisebbre (alacsonyabbra) a táblázatot Vegyük észre: a kód 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 37/8
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 megegyeznek az Új dolgozó panelen megírtakkal. 4. Mi lenne, ha elegánsan kitennénk ezeket egy osztályba (BC), és azt példányosítva használnánk (mint ahogy kell)?! 37/9
A BC (BasicClass) osztály kódja Hozzunk létre a projekthez egy sima osztály: File \ New \ Class Legyen az osztály neve: BC A NewEmp osztályból másoljuk át a kódot, a szükséges importokat és a szükséges változókat. Legyen minden változó és metódus statikus! import java.text.parseexception; import java.text.simpledateformat; import java.util.date; import javax.swing.joptionpane; import javax.swing.jtextfield; 3/1 public class BC { private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd"); private static String mes = "Emp program üzenet"; 37/10
A BC (BasicClass) osztály kódja public static String RF(JTextField a) { return a.gettext().tostring(); public static boolean filled(jtextfield a) { String s = RF(a); if (s.length() > 0) return true; else return false; public static boolean gooddate(jtextfield a) { String s = RF(a); Date testdate = null; try {testdate = sdf.parse(s); catch (ParseException e){return false; if (sdf.format(testdate).equals(s)) return true; else return false; public static boolean goodint(jtextfield a) { String s = RF(a); try {Integer.parseInt(s); return true; catch (NumberFormatException e){return false; 37/11 3/2
A BC (BasicClass) osztály kódja + public static void showmd(string s, int i){ 3/3 JOptionPane.showMessageDialog(null, s, mes, i); public static Date StoD(String s){ Date testdate = null, vid = null; try {testdate = sdf.parse(s); catch (ParseException e){return vid; if (!sdf.format(testdate).equals(s)){return vid; return testdate; public static int StoI(String s){ int x=-55; x = Integer.parseInt(s); return x; public static void DF(JTextField a) { a.settext(""); Adott szövegmezőt kiürítő metódus //== osztály vége 37/12
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 (!BC.filled(nev) &&!BC.filled(szid) &&!BC.filled(lakh) &&!BC.filled(iq)) BC.showMD("Egyetlen módosító adat sincs beírva!",0); else if (BC.filled(szid) &&!BC.goodDate(szid)) BC.showMD( "A Születési idő mezőben hibás adat van!",0); else if (BC.filled(iq) &&!BC.goodInt(iq)) BC.showMD( "Az IQ mezőben hibás adat van!",0); else { 37/13
Az EmpMod panel Módosítás gombjának kódja ); 37/14 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) BC.showMD("Nincs kijelölve a módosítandó rekord!",0); if (db>1) BC.showMD("Több rekord van kijelölve!\negyszerre csak egy rekord módosítható!",0); if (db==1) { if (BC.filled(nev)) etm.setvalueat(bc.rf(nev), jel, 2); if (BC.filled(szid)) etm.setvalueat(bc.rf(szid), jel, 3); if (BC.filled(lakh)) etm.setvalueat(bc.rf(lakh), jel, 4); if (BC.filled(iq)) etm.setvalueat(bc.rf(iq), jel, 5); BC.showMD("A rekord módosítva!",1); BC.DF(nev); BC.DF(szid); BC.DF(lakh); BC.DF(iq); etm.setvalueat(new Boolean(false), jel, 0);
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) { super(f, "Dolgozók listája", true); etm = betm; setbounds(100, 100, 500, 300); A helyreállított konstruktor Az ideiglenes emp példány hűlt helye 37/15
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) BC.showMD("Nincs módosítható adat!", 0); else { EmpMod em = new EmpMod(EmpProgram.this, etm); em.setvisible(true); ); 37/16
A Módosítás funkció kipróbálása 3 1 2 9 7 4 5 37/17 8 6
Lista panel kialakítás a panel létrehozása 37/18
A feladat Feladat: folytassuk a 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 37/19
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 37/20
Az EmpDel panel kialakítása Nyissuk meg a panelt a WindowBuilder Editor-ral! 37/21
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 37/22
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! 37/23
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 többes törlés JCheckBox (jcb) kódja: jcb.addactionlistener(new ActionListener() { public void actionperformed(actionevent arg0) { md = jcb.isselected(); ); 37/24
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) BC.showMD("Nincs kijelölve a törlendő rekord!",0); if (!md) { if (db>1) BC.showMD("Több rekord van kijelölve!\negyszerre csak egy rekord törölhető!",0); if (db==1) { etm.removerow(jel); BC.showMD("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--; BC.showMD("Rekord(ok) törölve!",1); 37/25
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) BC.showMD("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! 37/26
Lista panel kialakítás a panel létrehozása 37/27
A feladat Feladat: folytassuk a panel életre keltését! - Készítsük el a Keresés funkciót - Kezdjük a grafikus felület kialakításával 37/28
A Keresés panel kialakítása EmpProgram EmpProgram, Design felület! Containers \ JPanel Bal felső sarok helyén kattintani, nyomva tartani az egeret, elhúzni a jobb alsó sarokba, elengedni az egeret! 37/29
A Keresés panel kialakítása EmpProgram Szegély a panel köré: Properties \ border... A többi tulajdonság maradjon! 37/30
A Keresés panel kialakítása EmpProgram Kapcsoljuk ki a panel elrendezés menedzserét! 1 3 2 37/31
A Keresés panel kialakítása EmpProgram Rakjuk a panelre a Keresés feliratot Rakjuk fel a Kód JRadioButton-t, Var: jrbkod, text: Kód Legyen kiválasztva ez az nyomógomb 37/32
A Keresés panel kialakítása EmpProgram Másolással készítsük el a többi rádiógombot: Név Lakóhely IQ Variable jrbnev jrblak jrbiq Text Név Lakóhely IQ Másolással készítsük el az X= feliratot Rakjunk fel egy szövegmezőt, Var: kulcs Rakjuk fel a Keresés gombot, Var: keres 37/33
A Keresés panel kialakítása EmpProgram Kódban alakítsuk ki a nyomógomb csoportot! Az egyes nyomógombok definíciója alá írjuk be a kódot: ButtonGroup bg = new ButtonGroup(); bg.add(jrbkod); bg.add(jrbnev); bg.add(jrblak); bg.add(jrbiq); Deklaráljunk egy változót, amiben mindig a kiválasztott keresőkulcs értéke lesz. Alapértéke a kod, hiszen ez ki van választva induláskor! private String kerkif="kod"; 37/34
A Keresés panel kialakítása EmpProgram Adjunk hozzá Design felületen akciókezelőt a jrbkod nyomógombhoz: jobb klikk \ Add event handler \ action \ actionperformed Adjuk hozzá az esemény kódját (állítsuk be a kerkif változó értékét) if (jrbkod.isselected()) kerkif="kod"; Ismételjük meg a fenti műveletsort a többi nyomógombra! if (jrbnev.isselected()) kerkif="nev"; if (jrblak.isselected()) kerkif="lak"; if (jrbiq.isselected()) kerkif="iq"; 37/35
Házi feladat Aki akarja (mindenki), az írja át úgy az Új dolgozó panel, és az EmpProgram osztály kódját, hogy az is a BC osztály metódusait használja! 37/36
VÉGE VÉGE 37/37