A feladatok megoldásához felhasználandó osztályok leírásait az alábbi URL-en találja meg: http://download.oracle.com/javase/6/docs/api/



Hasonló dokumentumok
A feladatok megoldásához felhasználandó annotációk leírásait az alábbi URL-en találja meg:

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

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.

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

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

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

POSZEIDON dokumentáció (1.2)

Szoftvertechnolo gia gyakorlat

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

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.

HVK Adminisztrátori használati útmutató

ONLINE SZAKÉRTŐI KERETRENDSZER

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

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

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

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

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

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

A megjelenő ablakban a Work with feliratú mezőbe gépeljük be az EclEmma plugin elérési útját:

Java Programozás 11. Ea: MVC modell

munkafüzet open eseményéhez

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

Táblázatos adatok használata

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

ZH mintapélda. Feladat. Felület

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

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

Teljesítményértékelések eredményeinek rögzítése az oktatói weben

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

ContractTray program Leírás

Programozási nyelvek Java

Hasonlóságelemzés COCO használatával

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

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

BME MOGI Gépészeti informatika 8.

Egzinet Partner Portál

DebitTray program Leírás

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

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

Változás bejelentés / támogatási szerződésmódosítási kérelem beadása

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

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

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

3. Osztályok II. Programozás II

Access alapok. Megnevezés Művelet Minta. Új adatbázis létrehozása. Új / Üres adatbázis.. Tábla létrehozása tervező nézetben.

ServiceTray program Leírás

Készítsen egy adatbázist (egytáblásat) egy számítástechnikai tanfolyam résztvevőiről. Az adattábla rögzítse a következőket:

Választó lekérdezés létrehozása

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

Rácsvonalak parancsot. Válasszuk az Elsődleges függőleges rácsvonalak parancs Segédrácsok parancsát!

és az instanceof operátor

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

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

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

Java felhasználói felület

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

Ügyfélforgalom számlálás modul

A Java nyelv. Dialógus ablakok. Elek Tibor

Oktatási segédanyag. Weboldalszerkesztési gyakorlatok

Országos Területrendezési Terv térképi mel ékleteinek WMS szolgáltatással történő elérése, MapInfo program alkalmazásával Útmutató 2010.

Országos Területrendezési Terv térképi mellékleteinek WMS szolgáltatással történő elérése, MapInfo program alkalmazásával

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

Címzett: Kovács Gézáné Szeged, Híd u. 1. Tisztelt Kovács Gézáné! Örömmel értesítjük, hogy Ön megnyerte nyereményjátékunk 1000 Ft-os díját.

HASZNÁLATI ÚTMUTATÓ DOLGOZÓK IMPORTÁLÁSA KULCS BÉR PROGRAMBA AZ ONLINE MUNKAIDŐ NYILVÁNTARTÓ RENDSZERBŐL. Budapest, november 08.

OKTATÁSKUTATÓ ÉS FEJLESZTŐ INTÉZET TÁMOP-3.1.5/ Pedagógusképzés támogatása

O365 és felhő szolgáltatások igénybevételéhez szükséges beállítások

Elemi Alkalmazások Fejlesztése Beadandó Feladat Juhász Ádám

WebAromo elindítása, bejelentkezés

Webshop készítése ASP.NET 3.5 ben I.

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

Eseményvezérelt és objektumorientált programozás

Az FMH weboldal megnyitásakor megjelenő angol nyelvű üzenetek eltüntetése

kommunikáció Megoldások

Munka a fájlokkal. Az általánosan használt fájltípusok. Programfájlok. Adatfájlok

ADATSZOLGÁLTATÁS központi honlap használata esetén

Archivált tanulmányi adatok importálása. Felhasználói dokumentáció verzió 2.0.

DAT adatcserefájl AutoCAD MAP DWG mapobject konvertáló program dokumentáció

A d m i n i s z t r á c i ó s f e l a d a t o k a I n t e g r á l t K ö n y v t á r i R e n d s z e r b e n

Integráció LadyBirddel

Ezek után már csak a Mentés és a Lekérdezés Futtatása (az ellenőrzés miatt) van hátra. Ügyeljünk, hogy a mentésnél a megadott (Kezd) nevet adjuk meg.

Felhasználói leírás a DimNAV Server segédprogramhoz ( )

OOP: Java 8.Gy: Gyakorlás

Kézikönyv. Szelekciós jegyzék 2.

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

Gyakorlati vizsgatevékenység B

Ingyenes DDNS beállítása MAZi DVR/NVR/IP eszközökön

1. Az Access 2000 indítása után válasszuk az Üres adatbázis létrehozása pontot,

A. Webes metaadat szerkesztő

BME MOGI Gépészeti informatika 18. Grafika, fájlkezelés gyakorló óra. 1. feladat Készítsen alkalmazást az = +

New Default Standard.ipt

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

POSZEIDON dokumentáció (12.2)

Gyakorló 9. feladat megoldási útmutató

Online naptár használata

Programozás BMEKOKAA146. Dr. Bécsi Tamás 10. Előadás

Hogyan lehet Pivot tábla segítségével komplex adatokat elemezni és bemutatni?

Tárgyfelvétel előtti órarendi nézet (órarend tervező) a Neptun HWEB-en

Átírás:

Java Swing MVC labor Készítette: Budai Péter, BME IIT, 2012. A feladatok megoldásához felhasználandó osztályok leírásait az alábbi URL-en találja meg: http://download.oracle.com/javase/6/docs/api/ Továbbá nagy segítséget jelenthet az alábbi URL-en elérhető JTable Tutorial is, amely az összes gyakori (és a feladatban előforduló) problémára mutat megoldást: http://download.oracle.com/javase/tutorial/uiswing/components/table.html 1 Projekt megnyitása A tárgyhonlap eheti laborfeladatához tartozó oldaláról töltse le a feladat megoldásához használható Eclipse projekt vázat. Ez egy ZIP archívum, amelyet közvetlenül be lehet importálni az Eclipse-be. Ehhez válassza a File/Import... menüpontot, majd ott keresse ki az Existing projects into workspace lehetőséget! A felbukkanó ablakban tallózza ki a letöltött archívumot, majd kattintson a Finish gombra (lásd az alábbi ábrát). A beimportált projektben három Java fájl és egy.dat kiterjesztésű állomány található, melyek egy kezdetleges hallgatói nyilvántartó program részei. A students.dat fájlban találhatóak a hallgatói adatok (név, neptunkód, aláírás, jegy) szerializálva. A StudentFrame osztály valósítja meg az alkalmazás felhasználói felületét, ami egyelőre csak annyit tesz, hogy betölti a hallgatói adatokat 1

(melyeket a StudentData osztály egy példánya tárol a data attribútumban), megjelenít egy üres ablakot, bezáráskor pedig újra kimenti az adatokat. Röviden tanulmányozza át, majd próbálja ki az alkalmazást! Az alábbi üres ablakot kell kapnia: Fontos, hogy a feladatok megoldása során csak ott módosítsa a kiinduló forráskódot, ahol azt a kommentek nem tiltják! 2 Táblázat létrehozása Adjon hozzá egy táblázat komponenst (JTable) az ablak középső területéhez (BorderLayout.CENTER)! Ügyeljen rá, hogy a táblázat töltse ki az egész ablakot (setfillsviewportheight metódus), illetve hogy lapozható legyen a gördítősáv segítségével! Ehhez a táblázatot egy lapozható panelbe kell elhelyezni (JScrollPane). Ahhoz, hogy a táblázatban adatok is szerepeljenek, meg kell adnunk, hogy mit használjon adatforrásként. Ehhez a StudentFrame osztályban már szereplő data objektumot fogjuk majd használni, ami a StudentData osztály egy példánya. De a StudentData osztály jelenlegi formájában nem képes ellátni az adatforrás szerepét. Ehhez a StudentData osztályt származtatnia kell az AbstractTableModel ősosztályból! Magyarázat: Az AbstractTableModel osztály megvalósítja a TableModel interfészt, méghozzá úgy, hogy minden metódus törzse üres. Ezért ha ebből az osztályból származtatunk, sokkal kevesebb metódust kell felüldefiniálnunk, mintha magát a TableModel interfészt valósítottuk volna meg a StudentData osztállyal. A StudentData osztályban definiálja felül és implementálja az AbstractTableModel osztály megfelelő metódusait (getcolumncount, getrowcount, getvalueat) úgy, hogy a táblázat komponens meg tudja jeleníteni az adatokat! Emlékeztető: A táblázatnak 4 oszlopa van (név, neptun, aláírás, jegy) és annyi sora, ahány hallgatónk van a students listában. Segítségül a getvalueat függvényt megadjuk: public Object getvalueat(int rowindex, int columnindex) { Student student = students.get(rowindex); switch(columnindex) { case 0: return student.getname(); case 1: return student.getneptun(); case 2: return student.hassignature(); default: return student.getgrade(); 2

Ha elkészült a StudentData osztály, akkor csak annyi van hátra, hogy a táblázat komponensen beállítsuk, hogy a data attribútumot használja adatmodellként. Ehhez vagy adjuk át konstruktorparaméterként a JTable objektum létrehozásakor, vagy utólag állítsuk be a JTable objektum setmodel függvényével! Ha mindent jól csinált, akkor valami hasonlót kell kapnia: 3 Oszlopok testre szabása Fejlessze tovább a programot úgy, hogy a táblázat fejlécei a megfelelő szövegeket (sorrendben Név, Neptun, Aláírás, Jegy) tartalmazzák! Ehhez az AbstractTableModel ősosztály megfelelő metódusát (getcolumnname) kell felüldefiniálnia a StudentData osztályban. Szintén az ősosztály egy másik metódusának (getcolumnclass) felüldefiniálásával érje el, hogy a táblázat Aláírás és Jegy oszlopai a típusuknak megfelelő formában kerüljenek megjelenítésre! Például az aláírásnál a true/false értékek helyett egy jelölőnégyzet szerepeljen, ahogy az alábbi ábrán is látható! Javaslat: Az oszlop típusának visszaadásához el kell kérnie a megfelelő típushoz tartozó típusleírót. Ezt az osztálynév után írt.class kulcsszóval kaphatjuk meg. Például String esetén String.class-t kell visszaadni, Boolean esetén Boolean.class-t, Integer esetén Integer.class-t. 4 Cellák szerkesztése Tegye lehetővé a felhasználó számára a jegy oszlopában szereplő értékek módosítását! Ehhez bővítse a StudentData osztályt az AbstractTableModel megfelelő metódusainak felüldefiniálásával! 3

Egyrészt tegye lehetővé a 3. és 4. oszlopban szereplő cellák szerkesztését (iscelleditable), valamint az osztály képes legyen eltárolni a felhasználói felületen bevitt értéket a students listában (setvalueat). Próbálja ki az alkalmazást! Indítsa el, módosítsa valamelyik cella értékét, majd zárja be, és indítsa el újra a programot! Ha mindent jól csinált, a módosított érték az alkalmazás újraindítása után is megmarad. 5 Adatmodell módosítása Tegye lehetővé, hogy a táblázatba új hallgatókat is fel lehessen venni! Ehhez vegyen fel az ablak alsó területére (BorderLayout.SOUTH) egy új panelt (JPanel), amin szerepeljen két beviteli mező a név és neptunkód számára (JTextField, 20 és 6 karakter szélesek), a hozzájuk tartozó címkék (JLabel) és egy gomb (JButton, azzal a felirattal, hogy Felvesz)! Javaslat: A nevet és a neptunkódot tartalmazó JTextField-eknek vegyen fel tagváltozót az ablak osztályba (pl. namefield és neptunfield), mivel a gomb eseménykezelőjében szükség lesz rájuk! A panel elrendezése maradhat az alapértelmezett FlowLayout. A hallgatói adatokat kezelő StudentData osztályban vegyen fel egy új metódust, amivel új hallgatót lehet felvenni az adatmodellbe: public void addstudent(string name, String neptun) {... A metódus adja hozzá az új hallgató adatait a hallgatók listájához! A hallgató neve és neptunkódja legyen a paraméterek által megadott érték, az aláírása false, a jegye pedig 0 (nulla) értékű! Ahhoz, hogy az új hallgató a felhasználói felületen is megjelenjen, a táblázatot értesíteni kell arról, hogy az 4

adatok megváltoztak. Ehhez hívja meg az AbstractTableModel ősosztály megfelelő metódusát (firexxx)! Melyik metódust célszerű használni? Végül adjon hozzá a StudentFrame osztályban egy eseménykezelőt (ActionListener) a Felvesz feliratú gombhoz! A gomb megnyomására adja hozzá az új hallgatót (az imént elkészített metódus segítségével) a hallgatói adatokhoz, méghozzá a két beviteli mezőben szereplő névvel és neptunkóddal! Ha mindent jól csinált, akkor a gomb lenyomására megjelenik az új hallgató a táblázat utolsó sorában. 6 Rendezés Módosítsa úgy az alkalmazást, hogy a táblázat fejlécére kattintva az adott oszlop szerint növekvő sorrendben történjen a sorok rendezése! A rendezésre kiválasztott oszlopon történő újabb kattintás ezúttal az adott oszlop szerint csökkenő sorrendbe rendezze a sorokat! Újabb kattintás esetén megint növekvőbe, és így tovább felváltva. Egy másik oszlop kiválasztásakor először mindig növekvő legyen a rendezés iránya! Ehhez be kell állítania a JTable komponensen, hogy milyen rendező objektumot használjon a táblázat sorainak rendezéséhez (setrowsorter). Az alapértelmezett rendező osztály (TableRowSorter) egy példánya most tökéletesen megfelel a célra. Javaslat: A megoldás sokkal egyszerűbb, mint gondolná. Ha elakad, nézze meg a feladatkiírás elején szereplő URL-en a JTable Tutorial-t, abban még példakód is szerepel. 5

7 Cellák testre szabása Módosítsa az alkalmazást oly módon, hogy (az alábbi ábrához hasonlóan) a táblázatban különböző háttér-színnel legyenek jelölve azok a hallgatók, akik átmentek (zöld) és azok, akik egyelőre bukásra állnak (piros), mert vagy az aláírásuk nincs meg vagy a jegyük rosszabb kettesnél! Ehhez egy (vagy több) saját StudentTableCellRenderer osztályt kell implementálnia a StudentFrame osztályon belül, ami megvalósítja a TableCellRenderer interfészt. Ezt az osztályt azután hozzá lehet rendelni a JTable komponenshez (setdefaultrenderer), aminek hatására az adott típusú cellák kirajzolásához a megadott saját osztályt fogja használni a táblázat. A StudentTableCellRenderer osztály gettablecellrenderercomponent metódusa adja vissza azt a Java Swing komponenst, amit az adott cella megjelenítéséhez a JTable-nek használnia kell. Javaslat: Mivel három különböző adattípust megjelenítő cella van a táblázatunkban, célszerű inkább valamiféle csomagoló osztályt létrehozni, mely az eredeti megjelenítő (table.getdefaultrenderer()) objektumot használja, és csak módosítja az általa megfelelően előkészített komponenst oly módon, hogy az a megfelelő háttérszínnel jelenjen meg. class StudentTableCellRenderer implements TableCellRenderer { private TableCellRenderer renderer; public StudentTableCellRenderer(TableCellRenderer defrenderer) { this.renderer = defrenderer; 6

public Component gettablecellrenderercomponent(jtable table, Object value, boolean isselected, boolean hasfocus, int row, int column) { Component component = renderer.gettablecellrenderercomponent( table, value, isselected, hasfocus, row, column); // Kikeressük az éppen megjelenítendő hallgatót a külső, // StudentFrame osztály data tagváltozójából, // megállapítjuk, hogy bukásra áll-e vagy sem, // és ez alapján átállítjuk a komponens háttérszínét: // component.setbackground(...) return component; Figyeljen arra, hogy a rendezés miatt a megjelenítő osztály által kapott sor indexek eltérhetnek az adott hallgató adatainak az adatmodellben elfoglalt helyétől! Az aktuális modellbeli indexet a táblázathoz tartozó RowSorter példány megfelelő metódusa tudja megmondani nekünk (table.getrowsorter().convertrowindextomodel(row)). 7