Programozási technológia

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

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

Adatbázisok webalkalmazásokban

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

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

Programozási nyelvek Java

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

JavaServer Pages (JSP) (folytatás)

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

Java felhasználói felület

OO PDO. Tehát PDO használatával, könnyen átállhatunk egy másik adatbáziskezelőre, anélkül hogy a kódot teljes egészében újraírnánk.

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

Java Programozás 11. Ea: MVC modell

Programozási technológia

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Programozási technológia

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

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

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

Java és web programozás

Programozási technológia

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).

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

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

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

Szoftvertechnológia alapjai Java előadások

Tartalomjegyzék. Tartalomjegyzék 1. Az SQL nyelv 1 Az SQL DDL alapjai 2

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

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

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

A Java nyelv. Dialógus ablakok. Elek Tibor

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

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Adatbázis Rendszerek II. 8. Gyakorló környezet

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

Swing. (A javax.swing csomag)

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

Concurrency in Swing

Java programozási nyelv 5. rész Osztályok III.

DKÜ ZRT. A Portál rendszer felületének általános bemutatása. Felhasználói útmutató. Támogatott böngészők. Felületek felépítése. Információs kártyák

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Adatbázis Rendszerek I. 9. SQL alapok (DDL esettanulmány)

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

SQL- Utasítások csoportosítása Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER

Java és web programozás

JAVA SE/ME tanfolyam tematika

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

Programozás I. Első ZH segédlet

A relációs adatbáziskezelés szabványos nyelve Két fő csoportba sorolhatók az utasításai

SQL jogosultság-kezelés. Privilégiumok Grant és Revoke Grant Diagrammok

Generikus osztályok, gyűjtemények és algoritmusok

OOP: Java 8.Gy: Gyakorlás

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

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

8. Gyakorlat SQL. DDL (Data Definition Language) adatdefiníciós nyelv utasításai:

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

Programozási nyelvek II.: JAVA, 4. gyakorlat

Osztályok. 4. gyakorlat

B I T M A N B I v: T M A N

A WEB programozása - JSP1 dr.gál Tibor őszi félév

Collections. Összetett adatstruktúrák

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

ANDROID ALKALMAZÁSFEJLESZTÉS

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

Adatbázis Rendszerek II. 1. SQL programozási felületek 39/1B IT MAN

munkafüzet open eseményéhez

ABAP dictionary objektumok SAP adatmodell Táblák kezelése. Az SAP programozása 1. Tarcsi Ádám

Extrémen brutál, gyors talpaló PHP nyelvhez (database). v2.1

Szoftvertechnolo gia gyakorlat

Táblázatkezelés Excel XP-vel. Tanmenet

Programozási nyelvek II.: JAVA

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

C# osztályok. Krizsán Zoltán

C#, OOP. Osztályok tervezése C#-ban

SZÁMÍTÓGÉPES PROBLÉMAMEGOLDÁS

Adatbázis tartalmának módosítása

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

ZH mintapélda. Feladat. Felület

MS ACCESS 2010 ADATBÁZIS-KEZELÉS ELMÉLET SZE INFORMATIKAI KÉPZÉS 1

- Alkalmazásfejlesztési szemlélet megismerése - Java GUI készítés bemutatása Swing-ben - Órai feladat megoldása

Objektumorientált programozás C# nyelven

SQL ALAPOK. Bevezetés A MYSQL szintaxisa Táblák, adatok kezelésének alapjai

Enterprise JavaBeans. Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem. Az Enterprise JavaBeans

Segédanyag: Java alkalmazások gyakorlat

A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:

INFORMATIKAI ALAPISMERETEK

Abstract osztályok és interface-ek. 7-dik gyakorlat

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Adattípusok. Max. 2GByte

Egy dinamikus adatbázis megvalósítása egy megrendelő-raktározó alkalmazáson keresztül.

Adatbázis rendszerek II. Adatbázis elérése C# kliens programból ADO.NET API-n keresztül

Adattípusok. Max. 2GByte

Vizuális programozás gyakorlat

Szálkezelés. Melyik az a hívás, amelynek megtörténtekor már biztosak lehetünk a deadlock kialakulásában?

ADATBÁZIS-KEZELÉS FÉLÉVES FELADAT

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

Java II. I A Java programozási nyelv alapelemei

Átírás:

Programozási technológia Adatbáziskezelés (JDBC, Swing) Dr. Szendrei Rudolf ELTE Informatikai Kar 2018.

További szükséges komponensek JTable JComboBox JScrollPanel JSlider JPasswordField 2

JTable Adatok táblázatos formában való megjelenítésére alkalmas. Opcionálisan editálható. A JTable nem tartalmazza a megjelenített adatokat, az adatoknak csak egy nézete. 3

JTable feltöltése adatokkal A táblázat létrehozása történhet közvetlenül az adatok és oszlopnevek megadásával, melynek hátrányai, hogy Ilyenkor a táblázat minden cellája editálható Minden adattípus String-ként kezelt. A tömböt össze kell állítani... String[] columnnames = {"column1", "column2",...; Object[][] data = {{value1,value2,..., {value1,value2,...; JTable table = new JTable(data, columnnames); 4

JTable feltöltése adatokkal Minden táblázathoz tartozik, egy a tényleges adatokat tartalmazó objektum, amely implementálja a TableModel interfészt. Ez alapesetben egy DefaultTableModel példány. Az adatokat rugalmasabban tudjuk kezelni, ha ezt a modelt mi magunk definiáljuk. Ehhez származtatnunk kell az AbstractTableModel osztályból, és megvalósítanunk annak metódusait. A mi esetünkben az adatok egy ArrayList-ben érkeznek, aminek minden eleme egy HighScore típusú objektum lesz (ez tárolja a pálya nehézségi fokozatát/szintjét és a lépésszámot). 5

TableModel metódusai int getrowcount() sorok száma* int getcolumncount() oszlopok száma* getcolumnname(int col) oszlop neve Class getcolumnclass(int col) oszlop típusa boolean iscelleditable(int row, int col) szerkeszthető-e a cella. Object getvalueat(int row, int col) a cella értéke* setvalueat(object val, int row, int col) cellaérték beállítása * A pirossal jelölt metódusok implementálása kötelező. 6

Változások kezelése A model-ben történt adatváltozásokról a JTable-t értesíteni kell az AbstractTableModel megfelelő metódusának hívásával. (A mi esetünkben erre most nem lesz szükségünk ) Metódus firetablecellupdated firetablerowsupdated firetabledatachanged firetablerowsinserted firetablerowsdeleted firetablestructurechanged Változás Cella frissítése Sorok frissítése Teljes tábla frissítése Új sor került beszúrásra Sor törlés történt Teljes tábla érvénytelenítése (adatok és struktúra is) 7

Renderers Az azonos típusú adatok megjelenítéséhez ugyanaz a cell render komponens lesz felhasználva. Ha nincs explicit megadott renderer, a táblázat a getcolumnclass alapján választ egy alapértelmezettet. Boolean Jelölő négyzet Number jobbra igazított címke Date címke ImageIcon, Icon középre igazított címke Object a string értéket megjelenítő címke 8

JTable Rendezés, szűrés A rendezés legegyszerűbb módja, ha a táblázat autocreaterowsorter tulajdonságát igazra állítjuk. Készíthetünk azonban saját rendező objektumot is: TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel()); table.setrowsorter(sorter); A TableRowSorter egy Comparator objektumot használ a sorok rendezéséhez. Az oszlophoz tartozó Comparator kiválasztása az az alábbi sorrend szerint történik: setcomparator metódussal megadott Comparator, ha van. String oszloptípusnál String comparator. Comparable osztálynál, a compareto metódus használatos. Megadott StringConverter esetén rendezés az objektumok tostring reprezentációin. Minden más esetben a tostring eredményeit használó Comparator. 9

JTable Sorok szűrése A sorok rendezése mellett Sorter-el adható meg, mely sorok jelenjenek meg a táblázatban. A TableRowSorter a szűrést a javax.swing.rowfilter segítségével implementálja. RowFilter<MyModel, Object> rf = RowFilter.regexFilter("regexp", 0); sorter.setrowfilter(rf); Szűrések és rendezések használatakor az adatok más sorrendben szerepelhetnek a megjelenített táblázatban, mint a modellben. Az indexeket konvertálni kell a megjelenítés és a table model között a JTable által biztosított konvertáló metódusokkal: convertrowindextomodel, convertcolumnindextoview 10

JTable Kijelölés (Selection Mode) Alapértelmezésként a táblázat minden sora kiválasztható. A JTable.setSelectionMode metódussal változtatható meg a táblázatban engedélyezett kijelölés módja. Ennek értéke a javax.swing.listselectionmodel osztály konstansai lehetnek. (MULTIPLE_INTERVAL_SELECTION, SINGLE_INTERVAL_SELECTION, és SINGLE_SELECTION) 11

JTable Kijelölés (Selection Option) rowselectionallowed: ha igaz (és a columnselectionallowed hamis) akkor a sorok kijelölhetőek. columnselectionallowed: ha igaz (és a rowselectionallowed hamis) akkor az oszlopok kijelölhetőek. cellselectionenabled: ha igaz, cellák jelölhetőek ki. Kijelölés lekérdezése: JTable.getSelectedRows és JTable.getSelectedColumns. A kiválasztott indexek tömbjét adják meg. 12

JTable tartalmának görgetése JScrollPane scrollpane = new JScrollPane(table); table.setfillsviewportheight(true); ScrollPane létrehozása a táblázat konténereként, a táblázat automatikusan hozzáadásra kerül. setviewportheight: felhasználja-e a táblázat a konténer teljes magasságát akkor is, ha a táblának nincs elegendő sora. A ScrollPane a táblázat fejlécét automatikusan a viewport tetejére helyezi, az oszlopnevek görgetés közben is láthatóak maradnak. Oszlopok szélsessége Alapértelmezetten minden oszlop egyforma széles, a táblázat teljes szélességét kitöltik. Egy oszlop szélességének megváltoztatása: column = table.getcolumnmodel().getcolumn(0); column.setpreferredwidth(100); 13

JComboBox A komponens lehetőséget biztosít arra, hogy kiválasszunk egy elemet több lehetőség közül egy lenyíló lista segítségével. String[] petstrings = {"Bird","Cat","Dog","Rabbit","Pig"; //Create the combo box, select item at index 4. //Indices start at 0, so 4 specifies the pig. JComboBox petlist = new JComboBox(petStrings); petlist.setselectedindex(4); petlist.addactionlistener(this); 14

JSlider A JSlider komponens célja numerikus adatok megadása egy minimum és egy maximum érték között. JSlider slider = new JSlider( JSlider.HORIZONTAL, MIN, MAX, INIT); slider.addchangelistener(this); slider.setmajortickspacing(10); slider.setminortickspacing(1); slider.setpaintticks(true); slider.setpaintlabels(true); A slider mutatójának mozgatása esetén a changelistener StateChanged metódusa hívódik meg. 15

JSlider cimkék módosítása Hashtable labeltable = new Hashtable(); labeltable.put( new Integer( 0 ), new JLabel("Stop") ); labeltable.put( new Integer( FPS_MAX / 10 ), new JLabel("Slow") ); labeltable.put( new Integer( FPS_MAX ), new JLabel("Fast") ); slider.setlabeltable( labeltable ); slider.setpaintlabels(true); 16

JPasswordField A JTextField komponens leszármazottja, jelszavak megadásához szükséges speciális beviteli mező. Biztonsági megfontolásokból az értékét karakter tömbben tárolja String helyett. A komponens alapértelmezésként egy pont -ot ír minden karakter helyére, megváltoztatása: setechochar metódussal. A begépelt jelszó a getpassword metódussal érhető el. Ha az érték már nem szükséges, a visszakapott tömböt ki kell törölni. char[] input = asswordfield.getpassword();... Arrays.fill(input, '0'); 17

Feladat Egészítsük ki a korábban már implementált Sokoban játékot úgy, hogy egy külön ablakban meg tudjuk nézni melyik pályát hány lépésben sikerült megoldanunk. Az eredményeket tároljuk adatbázisban, és ha a játék során jobb eredményt érünk el, akkor ezt frissítsük az adatbázisban. A megjelenített táblázatban azt is mutassuk meg, ha egy pályát még nem oldottunk meg. Az eredményeket lehessen rendezni lépésszám, nehézségi szint vagy pályaszám szerint. 18

Feladat megoldása A feladatot két részfeladat megoldásaként értelmezhetjük, melyeket külön rétegekben oldunk meg. Létre kell hoznunk az eredmények megjelenítését (view réteg) Tárolnunk és frissítenünk kell az eredményeket egy adatbázisban (persistence réteg). Ehhez majd készítenünk kell egy adatbázist, amely egyetlen táblából fog állni. 19

Eredmények megjelenítése Az eredményeket egy a játék menüjéből megnyitható dialógusablak JTable komponensében jelenítjük meg 20

HighScore osztály package persistence; public class HighScore { public final String difficulty; public final int public final int level; steps;... // konstruktorok public HighScore(GameID gameid, int steps){... public HighScore(String difficulty, int level, int steps){...... // (difficulty, level) pároson generált hashcode és equals metódusok 21

HighScoreTableModel osztály package view; public class HighScoreTableModel extends AbstractTableModel{ private final ArrayList<HighScore> highscores; private final String[] colname = new String[]{"Nehézségi szint","pálya","lépésszám"; public HighScoreTableModel(ArrayList<HighScore> highscores){ this.highscores = highscores; @Override public int getrowcount() { return highscores.size(); @Override public int getcolumncount() { return 3; @Override public Object getvalueat(int r, int c) { HighScore h = highscores.get(r); if (c == 0) return h.difficulty; else if (c == 1) return h.level; return (h.steps == 0)? "Nincs megoldva" : h.steps; @Override public String getcolumnname(int i) { return colname[i]; 22

Dialógusablak az eredményekhez Korábban már láttuk, hogy az adatok görgetéséhez a JScrollPane-t használtuk, tegyük ezt most is. A táblázat konténereként létrehozva, és a táblázatot hozzáadva, utóbbit automatikusan görgethetjük. A táblázat oszlopnevei a viewport tetejére kerülnek, és ott görgetés közben is láthatóak maradnak. setfillsviewportheight: a JTable ezen metódusával mondhatjuk meg, hogy felhasználjuk-e a konténer teljes magasságát akkor is, ha nincs elegendő táblasor. Alapértelmezetten minden oszlop egyforma széles, a táblázat teljes szélességét kitöltik. Oszlopszélesség megváltoztatása: column = table.getcolumnmodel().getcolumn(0); column.setpreferredwidth(100); 23

HighScoreWindow osztály package view; public class HighScoreWindow extends JDialog{ private final JTable table; public HighScoreWindow(ArrayList<HighScore> highscores, JFrame parent) { super(parent, true); table = new JTable(new HighScoreTableModel(highScores)); table.setfillsviewportheight(true); // rendezés megvalósításának helye... add(new JScrollPane(table)); setsize(400,400); settitle("dicsőség tábla"); setdefaultcloseoperation(windowconstants.dispose_on_close); setlocationrelativeto(null); setvisible(true); 24

Eredmények rendezése A rendezés sorrendjét és irányát a setsortkeys metódussal adhatjuk meg. Egészítsük ki a HighScoreWindow osztályunkat a rendezéssel. public class HighScoreWindow extends JDialog{ public HighScoreWindow(ArrayList<HighScore> highscores, JFrame parent){... TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel()); List<RowSorter.SortKey> sortkeys = new ArrayList<>(); sortkeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING)); sortkeys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING)); sorter.setsortkeys(sortkeys); table.setrowsorter(sorter);... 25

Sokoban adatbázis Hozzuk létre a játékunk adatbázisát, mely a HighScore típusú objektumok attribútumait tárolja. Ezen belül is a nehézségi fokozat és szint együttesen alkosson egy egyedi kulcsot, ami a pályát egyértelműen képes azonosítani. CREATE DATABASE IF NOT EXISTS sokoban; USE sokoban; CREATE TABLE IF NOT EXISTS HighScore ( Difficulty VARCHAR(50) NOT NULL, GameLevel INT NOT NULL, Steps INT, PRIMARY KEY(Difficulty, GameLevel) ); 26

Database osztály Tárolja a pályákon elért legjobb eredményt (0, ha megoldatlan). public class Database { private final String tablename = "highscore"; private final Connection conn; private final HashMap<GameID, Integer> highscores; public Database(){ Connection c = null; try { c = ConnectionFactory.getConnection(); catch (Exception e) { System.out.println("No connection"); conn = c; highscores = new HashMap<>(); loadhighscores(); // betölti az adatbázisból az eredményeket... 27

Database osztály Eredmények betöltése az adatbázisból private void loadhighscores(){ try (Statement stmt = conn.createstatement()) { ResultSet rs = stmt.executequery("select * FROM "+tablename); while (rs.next()){ String diff = rs.getstring("difficulty"); int level = rs.getint("gamelevel"); int steps = rs.getint("steps"); GameID id = new GameID(diff, level); mergehighscores(id, steps, false); catch (Exception e){ System.out.println("loadHighScores error"); 28

Database osztály A betöltött eredményt összefésüljük a már ismerttel. private boolean mergehighscores(gameid id, int score, boolean store){ boolean doupdate = true; if (highscores.containskey(id)){ int oldscore = highscores.get(id); doupdate = ((score < oldscore && score!= 0) oldscore == 0); if (doupdate){ highscores.remove(id); highscores.put(id, score); if (store) return storetodatabase(id, score) > 0; return true; return false; 29

Database osztály Frissítsük az adatbázist, ha jobb eredményt érünk el, és mondjuk meg hány sort érintett a változás. private int storetodatabase(gameid id, int score){ try (Statement stmt = conn.createstatement()){ String s = "INSERT INTO " + tablename + " (Difficulty, GameLevel, Steps) " + "VALUES('" + id.difficulty + "'," + id.level + "," + score + ") ON DUPLICATE KEY UPDATE Steps=" + score; return stmt.executeupdate(s); catch (Exception e){ System.out.println("storeToDatabase error"); return 0; 30

Database osztály Adjuk meg HighScore listaként a pályákon elért legjobb eredményeinket. public ArrayList<HighScore> gethighscores(){ ArrayList<HighScore> scores = new ArrayList<>(); for (GameID id : highscores.keyset()){ HighScore h = new HighScore(id, highscores.get(id)); scores.add(h); return scores; 31

További feladatok MainWindow osztály A menüben létre kell hozni egy új menüpontot, a dicsőség tábla megtekintéséhez. Game osztály Létre kell hozni egy adatbázis példányt a konstruktorból. A pálya megoldásakor meg kell hívni az adatbázis storehighscore metódusát, és el kell tárolni adattagként, hogy ügyesebbek voltunk-e most (isbetterhighscore). Készítsünk egy isbetterhighscore gettert. Készítsünk egy isgameended metódust. A addnewgamelevel metódus tegye ismertté a pályát a Database osztály számára a storehighscore hívással. 32