Java Programozás 7. Gy: Java alapok Adatkezelő 3.rész 39/1 B ITv: MAN 2018.04.11
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. 39/2
Új dolgozó panel New \ Swing \ JDialog Vegyük ki a pipát! 39/3
Ú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, 39/4 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)! 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. 39/5
Ú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)); ); 39/6
Új dolgozó panel Kódok beszúrása: Új metódusok: 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; 39/7
Új dolgozó panel Kódok beszúrása: Új metódusok: 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 változó: private SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd"); 39/8
Új dolgozó panel Kódok beszúrása: Új metódus: kódrövidítés miatt! public void showmd(string s, int i){ JOptionPane.showMessageDialog(null, s, mes, i); 0 1 2 3 Szükséges import: import javax.swing.joptionpane; Szükséges változó: private String mes = "Emp program üzenet"; 39/9
Új dolgozó panel A Beszúr gomb kódja: btnbeszr.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { if (!filled(kod)) kod.settext(""+(maxkod+1)); if (!filled(nev)) showmd("a Név mező üres!", 0); else if (!filled(szid)) showmd("a Születési idő mező üres!", 0); else if (!gooddate(szid)) showmd("a Születési idő mezőben hibás adat van!", 0); else if (!filled(lak)) showmd("a Lakóhely mező üres!", 0); else if (!filled(iq)) showmd("az IQ mező üres!", 0); else if (!goodint(iq)) showmd("az IQ mezőben hibás adat van!", 0); ); 39/10
Ú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); 39/11
Új dolgozó panel 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: public Date StoD(String s){ Stringből dátum 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 int StoI(String s){ int x=-55; x = Integer.parseInt(s); return x; 39/12 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 39/13 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. 39/14
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 39/15
Az Emp típus kódja Getter metódusok hozzáadása: Jobbklikk az adattagok területére \ Source \ Generate Getters and Setters 39/16
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; 39/17
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 39/18
Új dolgozó panel 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 (!filled(lak)) showmd("a Lakóhely mező üres!", 0); else if (!filled(iq)) showmd("az IQ mező üres!", 0); else if (!goodint(iq)) showmd("az IQ mezőben hibás adat van!", 0); else { adat = new Emp(StoI(RF(kod)), RF(nev), StoD(RF(szid)), RF(lak), StoI(RF(iq))); showmd("adat beszúrva!", 1); kilep=1; dispose(); setvisible(false); ); 39/19
Új dolgozó panel Már csak két metódus szükséges, amikkel ki tudjuk olvasni a panel adatait: 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(); ); 39/20
Új dolgozó panel Töröljük ki a main függvényt a kódból: 39/21
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! 39/22
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 39/23
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"); 39/24
Az EmpProgram módosítása ujadat.addactionlistener(new ActionListener() { public void actionperformed(actionevent arg0) { ); 39/25 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 39/26 7
Lista panel kialakítás a panel létrehozása 39/27
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 39/28
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 39/29
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(); ); 39/30
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!")) 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); ); 39/31 public void SMD (String s){ JOptionPane.showMessageDialog(null, s, mes, 0);
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 39/32 etm.getrowcount()
Adatok kiírása csv fájlba public static 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(); JOptionPane.showMessageDialog(null, "Adatok kiírva!", mes, 1); catch (IOException ioe) { JOptionPane.showMessageDialog(null, "CsvWriter: "+ ioe.getmessage(), mes, 0); 39/33
A Kiírás funkció kipróbálása 1 2 3 5 4 39/34
A kiírt adat visszaolvasása 3 C:\Users\bitman\workspace\EmpOrai\prb.csv 2 1 5 4 6 39/35
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("")) SMD("Nincs megadva a Forrás!"); if (cel.equals(">>> Forrás") &&!fnev.gettext().equals("")) kifnev.settext(fnev.gettext()); ); 39/36
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); FileManager.CsvWriter(kiirfnev, etm); ); 39/37
Lista panel kialakítás a panel létrehozása 39/38
VÉGE VÉGE 39/39