Java Programozás 2. Gy: EmpProgram. Grafikus felületű adatkezelő program

Hasonló dokumentumok
Java Programozás 6. Gy: Java alapok. Adatkezelő 2.rész

Java Programozás 7. Gy: Java alapok. Adatkezelő 3.rész

Java Programozás 5. Gy: Java alapok. Adatkezelő 1.rész

Java Programozás 8. Gy: Java alapok. Adatkezelő 4.rész

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Java Programozás 11. Ea: MVC modell

Java Programozás 3. Gy: Java GUI. Swing, AWT

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

abkezel.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class abkezel extends JFrame {

Grafikus felhasználói felületek. Dr. Szendrei Rudolf Informatikai Kar Eötvös Loránd Tudományegyetem. Programozási technológia I. Dr.

Programozási technológia

Programozási technológia

Swing GUI készítése NetBeans IDE segítségével

Két csomag elemeiből lehet a felületet elkészíteni: awt: heavy weight komponensek; swing: light weight komponensek (időben később).

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

Java Programozás 10. Ea: JDBC. SQLite alapokon

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben

OOP: Java 8.Gy: Gyakorlás

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

OOP: Java 8.Gy: Abstract osztályok, interfészek

Johanyák Zsolt Csaba: Grafikus felület programozása. Copyright 2008 Johanyák Zsolt Csaba

A Java nyelv. Dialógus ablakok. Elek Tibor

Entity Framework alapú adatbáziselérés

Tájékoztató. Használható segédeszköz: -

Hozzunk létre két rekordot a táblában, majd véglegesítsünk (commit):

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

Egyszerűbb a Google keresőbe beírni a Sharepoint Designer 2007 letöltés kulcsszavakat és az első találat erre a címre mutat.

munkafüzet open eseményéhez

Műveletek makrókkal. Makró futtatása párbeszédpanelről. A Színezés makró futtatása a Makró párbeszédpanelről

ReszlAd fájl, kitöltési útmutató:

Gyorsított jegybeírás. Felhasználói dokumentáció verzió 2.0.

M-Fájlok létrehozása MATLAB-ban

Duál Reklám weboldal Adminisztrátor kézikönyv

Java gyakorlat feladatai e s megolda sai ( )

A feladatok megoldásához felhasználandó osztályok leírásait az alábbi URL-en találja meg:

Táblázatok. Táblázatok beszúrása. Cellák kijelölése

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Johanyák Zsolt Csaba: Ugráló gomb oktatási segédlet Copyright 2008 Johanyák Zsolt Csaba

Az importálás folyamata Felhasználói dokumentáció verzió 2.1.

Sorosítás (szerializáció) és helyreállítás. 1. Bináris sorosítás és helyreállítás Szükséges névterek Attribútumok. 1.3.

Lapműveletek. Indítsuk el az Excel programot és töröljük ki a Munka1 nevű munkalapot!

Szoftvertechnológia alapjai Java előadások

Johanyák Zsolt Csaba: Képnézegető program oktatási segédlet

Java felhasználói felület

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Java programozási nyelv 6. rész Java a gyakorlatban

3. Osztályok II. Programozás II

Informatika terméktervezőknek

Torna. A torna.csv UTF-8 kódolású állományban soronként egy versenyző eredményeit tároljuk. Az adatokat pontosvessző választja el egymástól.

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Lekérdezések I. Egyszerű választó lekérdezések

OOP: Java 4.Gy: Java osztályok

4. Gy: JAVA osztályok

VARIO Face 2.0 Felhasználói kézikönyv

ONLINE SZAKÉRTŐI KERETRENDSZER

Kifizetések kezelése. 1 Kifizetési dátumok megadása pénzügyi kódokhoz

Dokumentum létrehozása/módosítása a portálon:

Táblázatos adatok használata

Access gyakorlati feladatok lépésről lépésre

Se S r e ial a iza z t a ion o n (in n Ja J v a a v ) a Szerializáció

TANSZÉKI ADMINISZTRÁTORI SEGÉDLET: NEPTUN TÁRGYKEZELÉS, KURZUSKEZELÉS

Programozási nyelvek Java

Programozási nyelvek Java

3. Határozza meg és írja ki a minta szerint, hogy a forrásállományban hány kémiai elem felfedezési adatai

Táblázatok kezelése. 1. ábra Táblázat kezelése menüből

Grafikus felhasználói felületek. Abstract Window Toolkit, a java.awt és java.awt.event csomagok

Másodlagos adatok beszerzése és külső adattábla csatolása ArcGIS 10-ben

DebitTray program Leírás

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Hello World Servlet. Készítsünk egy szervletet, amellyel összeadhatunk két számot, és meghívásakor üdvözlőszöveget ír a konzolra.

Ügyviteli rendszerek hatékony fejlesztése Magic Xpa-val mobilos funkciókkal kiegészítve. Oktatók: Fülöp József, Smohai Ferenc, Nagy Csaba

3. Ezután a jobb oldali képernyő részen megjelenik az adatbázistábla, melynek először a rövid nevét adjuk meg, pl.: demo_tabla

Access adatbázis elérése OLE DB-n keresztül

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

BME MOGI Gépészeti informatika 4.

ElektrO-ParT elektronikai alkatrész nyilvántartó program leírás.

Kilencedik témakör: Lazarus-Firebird. Készítette: Dr. Kotsis Domokos

Vizuális programozás gyakorlat

Segítség a megoldáshoz: 1. Készítse el a Window-t az ábrának és az osztálydiagramnak megfelelően.

Listák, szótárak, fájlok Listák, szótárak, fájlok

Információs technológiák 1. Gy: HTML alapok

Átutalási csomag karbantartó modul

OOP: Java 6.Gy: Java osztályok. Definíció, static, túlterhelés

Aromo Szöveges értékelés normál tantárggyal

Oktatási anyag az MLSZ-IFA rendszerhez

Adatintegritás ellenőrzés Felhasználói dokumentáció verzió 2.0 Budapest, 2008.

Oktatási segédanyag. Weboldalszerkesztési gyakorlatok

Prezentáció Microsoft PowerPoint XP

SZE INFORMATIKAI KÉPZÉS 1

Teljesítményértékelések eredményeinek rögzítése a Neptun Egységes Tanulmányi Rendszerben

Pénzintézetek jelentése a pénzforgalmi jelzőszám változásáról

WCF, Entity Framework, ASP.NET, WPF 1. WCF service-t (adatbázissal Entity Framework) 2. ASP.NET kliens 3. WPF kliens

Szöveges fájlok szerkesztése Jegyzettömb használata

Stateless Session Bean

Bevezetés a QGIS program használatába Összeálította dr. Siki Zoltán

Általános funkciók partitúrái. Felhasználói dokumentáció verzió 2.0.

Kormányzati Elektronikus Aláíró és Aláírás-ellenőrző Szoftver

Alapok (a K2D rendszer alapjai)

Szoftvertechnolo gia gyakorlat

Átírás:

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