Alkalmazásfejlesztési technológia. Vizsgakövetelmények. 1. Megjelenítési technikák. Magasabb szintű komponensek. Feladat - RendererTeszt

Hasonló dokumentumok
Java programozási nyelv 8. rész Grafikus felhasználói felület

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

Java felhasználói felület

Programozási technológia

Szoftvertechnológia alapjai Java előadások

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

Swing. (A javax.swing csomag)

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

Objektumorientált programozás C# nyelven

Objektumorientált programozás C# nyelven

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

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

JAVA PROGRAMOZÁS 5.ELŐADÁS

Java felhasználói felület

Programozási technológia

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

VI. Grafikus Java alkalmazások

Java felhasználói felület

ALAPISMERETEK...6 A MICROSOFT ACCESS INDÍTÁSA...14 AZ ABLAK...14 MEGNYITÁS...16 TÁBLÁK...17 LEKÉRDEZÉSEK...18

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

Aronic Főkönyv kettős könyvviteli programrendszer

Objektumorientált programozás C# nyelven III.

II. év. Adatbázisok és számítógépek programozása

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

Java felhasználói felület

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

libgdx alapok, első alkalmazás

Programozás II. labor

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

Újdonságok. Release 2

Vényírás. 1. ábra. 1. oldal

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

Access 2010 Űrlapok és adatelérés

Poszeidon (EKEIDR) Irat és Dokumentumkezelő rendszer webes felület

Széchenyi István Szakképző Iskola

Java Programozás 11. Ea: MVC modell

Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

3. gyakorlat. 1/7. oldal file: T:\Gyak-ArchiCAD19\EpInf3_gyak_19_doc\Gyak3_Ar.doc Utolsó módosítás: :57:26

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.

FELHASZNÁLÓI LEÍRÁS a DIMSQL Integrált Számviteli Rendszer Készlet moduljának használatához

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Készítette: Citynform Informatikai Zrt.

Kari Adminisztrátor. Funkcionális leírás

Programozás III CSOMAGOK. Az összetartozó osztályok és interfészek egy csomagba (package) kerülnek.

Szövegszerkesztés alapjai I.

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

Programozási nyelvek Java

INFORMATIKAI ALAPISMERETEK

2048 3D. Csapatnév: kurkomisi. Név: Kurkó Mihály-Zsolt. Elérhetőség: telefon: Iskola: Márton Áron Gimnázium

Adatbázis-kezelés ODBC driverrel

eseményvezérelt megoldások Vizuális programozás 5. előadás

Segédanyag: Java alkalmazások gyakorlat

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

KETTŐS KÖNYVELÉS PROGRAM CIVIL SZERVEZETEK RÉSZÉRE

ZH mintapélda. Feladat. Felület

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

VISUAL BASIC ALAPISMERETEK

Microsoft Office 2010

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

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

MAGYAR POSTA BEFEKTETÉSI ZRT. e-befektetés. Felhasználói kézikönyv

Programozási technológia

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

Vizuális programozás gyakorlat

DIÁKIGAZOLVÁNY. Felhasználói dokumentáció verzió 3.7. Budapest, 2015.

FELHASZNÁLÓI ÚTMUTATÓ

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

3. Gyakorlat Ismerkedés a Java nyelvvel

A program els indítása Mikor el ször futtatjuk a nyilvántartó programot, az alábbi párbeszédablakkal találkozunk.

1. fejezet Microsoft Excel 2010 Tartománynevek... 3

KELE3. Felhasználói kézikönyv

Tartalomjegyzék 3 TARTALOMJEGYZÉK

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

MŰVELŐDÉSI ÉS KOMMUNIKÁCIÓS ALAPISMERETEK

Integrált ügyviteli rendszer: Kettős könyvelés modul

CIB Elektronikus Terminál

1. Bevezető A készülék bemutatása Első lépések... 5

GroupWise 5.2 használói jegyzet

FELHASZNÁLÓI KÉZIKÖNYV

TÁMOP VIR alprojekt VIR felhasználói kézikönyv

Objektumorientált programozás C# nyelven

OBJEKTUMORIENTÁLT TERVEZÉS ESETTANULMÁNYOK. 2.1 A feladat

Tipp A Word makrók kimerítõ tárgyalását megtalálhatjuk az O Reilly gondozásában megjelent Writing Word Macros címû könyvben.

Vizuális, eseményvezérelt programozás I.

ÁLTALÁNOS WEBLAPSZERKESZTÉSI TUDNIVALÓK ÁLTALÁNOS HTML KÓDOLÁSI TUDNIVALÓK

117. AA Megoldó Alfréd AA 117.

NeoCMS tartalommenedzselő szoftver leírása

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

BBS-INFO Kiadó, 2013.

5. modul - Adatbázis-kezelés

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

INFORMATIKAI ALAPISMERETEK

Az emelt szintű. informatika érettségi. programozási feladatainak. megoldása Java nyelven. NetBeans IDE 8.1 környezetben

Grafikus felületek a programozó szempontjából grafikus elemek absztrakt reprezentációja az egyes elemek tulajdonságait leíró adatstruktúrák.

Dr. Pétery Kristóf: AutoCAD LT 2002 Blokkok, Xrefek

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

Destour Outdoor 2.0 felhasználói kézikönyv

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

7. Előadás. Makrók alkalmazása. Salamon Júlia. Előadás I. éves mérnök hallgatók számára

INFORMATIKAI ALAPISMERETEK

Átírás:

Vizsgakövetelmények Magasabb szintű komponensek Tanár: Csöndes Emese E-mail: csondes@szamalk.hu Adatbázis-kezelés Tanár: Seres Iván E-mail: seres@szamalk.hu Felkészülést támogató anyagok http://www.gdf.hu/segedletek/270fo.htm Alkalmazásfejlesztési technológiák tantárgynál Vizsga Elméleti rész: Teszt Gyakorlati rész: Kötelező feladat bemutatása Késztette: Csöndes Emese 1 Késztette: Csöndes Emese 2 Magasabb szintű komponensek 1. Megjelenítési technikák 1. Megjelenítési technikák (szegélyek, segédszöveg ) 2. Elrendezési stratégiák (kártyás, box ) 3. Speciális panelek (füles, többrétegű, görgető ) 4. Adatbeviteli lehetőségek (speciális szövegmezők ) 5. Kijelzők (állapotjelző, nyomkövetés) 6. Vezérlési technikák (felbukkanó menü, eszközsor ) 7. Fastruktúra 8. Táblázat 9. Dokumentumkezelés (stílusos szöveg kezelése) 10. Alkalmazások közötti adatcsere (drag and drop technika) 11. Java babok Késztette: Csöndes Emese 3 1.1 Komponensek kinézetének meghatározása 1.2 Menü megjelenítésének finomítása 1.3 Szegélyezés 1.4 Segédszöveg 1.5 HTML-t értelmező komponensek Késztette: Csöndes Emese 4 1.1 Komponensek kinézetének meghatározása Minden komponensnek van egy alapkinézete. Szeretnénk a megszokott megjelenítést felváltani egy sajátos megjelenítési formára. A megjelenítés megváltoztatásának mechanizmusát a lista segítségével mutatjuk be. Feladat - RendererTeszt Van egy gyümölcsneveket tartalmazó tömbünk, melynek tartalmát háromféleképpen jelenítjük meg. Mindhárom esetben használjunk listát. Az első lista az alapértelmezett megjelenítést használja, vagyis az adatok szöveges reprezentációja jelenjen meg. (RendererTeszt.java) A második lista a gyümölcsneveknek megfelelő kép fájlokat jelenítse meg. (ListaMegjelenito1.java) A harmadik lista az általunk Java nyelven megfogalmazott rajzokat jelenítse meg. (ListaMegjelenito2.java) Késztette: Csöndes Emese 5 Késztette: Csöndes Emese 6 1

String[] adatok=new String[]{"alma", "eper", "meggy", "alma", "narancs", "meggy"; DefaultListModel dlm=new DefaultListModel(); JList lista1 = new JList(); JList lista2 = new JList(); JList lista3 = new JList();... Késztette: Csöndes Emese 7 Késztette: Csöndes Emese 8 for(int i=0; i<adatok.length; i++){ dlm.addelement(adatok[i]); lista1.setmodel(dlm); lista2.setcellrenderer(new ListaMegjelenito1()); lista2.setmodel(dlm); lista3.setcellrenderer(new ListaMegjelenito2()); lista3.setmodel(dlm); ListaMegjelenito1, ListaMegjelenito2 osztályunknak a következő előírásokat kell teljesítenie: - Őse a JLabel, mivel a lista elemeinek megjelenítése JLabel segítségével történik. - Implementálja a ListCellRenderer interfészt. - Kifejti az interfész egyetlen metódusát getlistcellrenderercomponent( ), mely a megjelenést határozza meg. Késztette: Csöndes Emese 9 Késztette: Csöndes Emese 10 Osztálydiagram Késztette: Csöndes Emese 11 Késztette: Csöndes Emese 12 2

ListCellRenderer interfész Csomag: javax.swing Deklaráció: public interface ListCellRenderer Metódusa public Component getlistcellrenderercomponent( JList list, Object value, int index, boolean isselected, boolean cellhasfocus ) Késztette: Csöndes Emese 13 public class ListaMegjelenito1 extends JLabel implements ListCellRenderer { public ListaMegjelenito1() { public Component getlistcellrenderercomponent( JList list, Object value, int index, boolean isselected, boolean cellhasfocus){ sethorizontalalignment(jlabel.center); seticon(new ImageIcon("images/"+ value.tostring()+".jpg")); return this; Késztette: Csöndes Emese 14 Saját rajzos megjelenítése protected void paintcomponent(graphics g){ if(gyumi.equals("alma")) alma(g); else if(gyumi.equals("eper")) eper(g); else if(gyumi.equals("meggy")) meggy(g); else if(gyumi.equals("narancs")) narancs(g); Lista elemeinek elrenedzése setlayoutorientation( ) Késztette: Csöndes Emese 15 Késztette: Csöndes Emese 16 JList osztály Jellemzők int fixedcellwidth int fixedcellheight Megadja a listaelem szélességét/magasságát. Color selectedbackground Color selectedforeground Megadja a kiválasztott elem háttér- és előtérszínét. Metódusok void setcellrenderer(listcellrenderer l) Beállítja, hogy a lista elemeit az általunk meghatározott formában jelenítse meg. 1.2 Menü megjelenítésének finomítása A Box objektumok az adott területen szétterülnek (vagyis kitöltik a rendelkezésre álló maximális területet) és láthatatlanok (így jelenlétük nem észlelhető, csak hatásuk). A Box osztály objektumai bármely konténer komponens (menü, eszközsor, panel ) esetében alkalmazható. Késztette: Csöndes Emese 17 Késztette: Csöndes Emese 18 3

Box Háromféle megvalósítása van: Box Glue Strut A programba beillesztve nem látjuk hatását. Láthatatlan méret nélküli komponensként vesz részt a megjelenítésben. Szerepe: tetszőleges, Component-ből származtatott komponens elhelyezhető benne. A BoxLayout-os elrendezés megvalósításánál alkalmazzuk. Késztette: Csöndes Emese 19 Késztette: Csöndes Emese 20 Glue Mindkét, vagy a kitüntetett irány maximálisan elfoglalható területét veszi fel méretként. Strut Meghatározható a lefoglalt terület mérete. Akár mindkét irányba, akár csak az egyik, kitüntetett irányba. Az ábrán látható menü megvalósítása: menusor.add(mfajl); menusor.add(mszerk); menusor.add(mbeall); menusor.add(box.createhorizontalglue()); menusor.add(msugo); menusor.add(mki); Késztette: Csöndes Emese 21 Késztette: Csöndes Emese 22 1.3 Szegélyezés Dekorációs cél, a felületi elemek kiemelése, összetartozó elemek behatárolása BorderFactory osztály create és az adott szegély nevének megadása például: BorderFactory.createBevelBorder( ) EmptyBorder (üres szegély): láthatatlan szegély; levegősebb megjelenítéshez alkalmazzuk, például az ablakkerettől való eltávolításhoz. Késztette: Csöndes Emese 23 Késztette: Csöndes Emese 24 4

LineBorder (vonalas szegély): adott színű, adott vastagságú sima vonalas szegély. BevelBorder: a felülethez képest vagy bemélyedés (Lowered) vagy kitüremkedés (Raised) hatását keltő 3D-s szegély. static Border createbevelborder( int type, Color highlightouter, Color highlightinner, Color shadowouter, Color shadowinner) type: Lowered, Raised Késztette: Csöndes Emese 25 Késztette: Csöndes Emese 26 setbackground(new Color(255,0,255)); BorderFactory.createBevelBorder( BevelBorder.RAISED, new Color(255,255,255), new Color(255,168,255), new Color(84,0,84), new Color(168,0,168)); CompoundBorder (összetett szegély): bármely két szegély kombinációja. A megadott szegélyek egyike külső, másik a belső szegélyként jelenik meg. static CompoundBorder CreateCompoundBorder( Border outsideborder, Border insideborder) Késztette: Csöndes Emese 27 Késztette: Csöndes Emese 28 EtchedBorder: vonalas 3D szegély, melynek típusa (Raised, Lowered), megadható. static Border createetchedborder(int type, Color highlight, Color shadow) highlight: Color.cyan shadow: Color.blue Késztette: Csöndes Emese 29 MatteBorder: tetszőleges kép szegélyként való alkalmazása. A szegély a következőképpen áll elő: a bal felső sarokból kiindulva tapéta jelleggel lefekteti a kiválasztott képet a keretezendő felület egészén, majd ebből megjeleníti a szegély területét. Vagyis érdemes olyan képet választani, mely mozaikos elrendezésben is összefüggő hatást biztosít. Késztette: Csöndes Emese 30 5

static MatteBorder creatematteborder(int top, int left, int bottom, int right, Color color) static MatteBorder creatematteborder(int top, int left, int bottom, int right, Icon tileicon) ) TitledBorder (címkés szegély): címkével kiegészített tetszőleges szegély. A címke szegélyhez igazított helyzete mind vízszintes irányban (LEFT, CENTER, RIGHT, LEADING, TRAILING), mind függőleges irányban (ABOVE_TOP, BELOW_TOP, TOP, ABOVE_BOTTOM, BELOW_BOTTOM, BOTTOM) meghatározható creatematteborder(1,3,5,7,color.yellow) creatematteborder(7,5,3,1, ) Késztette: Csöndes Emese 31 static TitledBorder createtitledborder( Border border, String title, int titlejustification, int titleposition, Font titlefont, Color titlecolor) Késztette: Csöndes Emese 32 1.4 Segédszöveg Minden komponenshez hozzárendelhető A komponens fölött várakozó egér hatására jelenik meg Célja: komponens használatát segítő, magyarázó információ megjelenítése, egyfajta gyors segítség nyújtás. Késztette: Csöndes Emese 33 Késztette: Csöndes Emese 34 1.5 HTML-t értelmező komponensek JLabel lb=new JLabel("Itt a piros?"); lb.settooltiptext("nem nyert! :("); A Javaban használt komponensek egy része képes a szövegként kapott HTML tag-eket értelmezni Ilyen komponensek például a címke, segédszöveg, gomb. Késztette: Csöndes Emese 35 Késztette: Csöndes Emese 36 6

Például: String html="<html><body>bármi megjeleníthető," +"ami HTML tagek segítségével leírható"+ "<hr>"+ "például táblázat:<br>"+ "<table border=1>"+ "<tr><td></td><td></td></tr>"+ "</table>"+ "<br>"+ "felsorolás:<br>"+ "<li>1</li>"+ "<li>2</li>"+ "</body> </html>"; lb.settext(html); Késztette: Csöndes Emese 37 Késztette: Csöndes Emese 38 -Segédszöveg -Gomb settooltiptext("<html><h1> <font color='#ff0000'> NYERT!!! </h1></html>") bt.settext("<html><h1>g</h1> <h2>o</h2> <h3>m</h3> <h4>b</h4></html>"); Késztette: Csöndes Emese 39 Késztette: Csöndes Emese 40 2. Elrendezési stratégiák Ismerjük már a: sorfolytonos elrendezést (FlowLayout), a rácsos elrendezést (GridLayout) a határmenti elrendezést (BorderLayout). A továbbiakban újabb elrendezéseket ismerünk meg, melyek segítségünkre lesznek a felhasználói felület kialakításában. null layout BoxLayout CardLayout GridBagLayout ScrollPaneLayout Késztette: Csöndes Emese 41 Késztette: Csöndes Emese 42 7

2.1 null elrendezés 2.2 BoxLayout elrendezés Nincsen előre meghatározott elrendezés. Minden komponens pozícióját és méretét meg kell határoznunk. A komponenseket vízszintes, vagy függőleges irányban helyezhetjük el egymás mellé. Késztette: Csöndes Emese 43 Késztette: Csöndes Emese 44 A komponens vonalhoz képesti helyzetét egy 0 <= x <=1 értékkel adhatjuk meg (x float típusú). Megvalósítás: pn1.setlayout(new BoxLayout( pn1,boxlayout.y_axis)); pn2.setlayout(new BoxLayout( pn2,boxlayout.x_axis)); 2.3 CardLayout elrendezés bt1.setalignmentx((float) 0.5); bt6.setalignmenty((float) 1.0); Késztette: Csöndes Emese 45 Késztette: Csöndes Emese 46 Container panelok=new Container(); CardLayout cl = new CardLayout(); panelok.setlayout(cl); panelok.add(pn1, "fehér"); panelok.add(pn2, "sárga"); panelok.add(pn3, "narancs"); panelok.add(pn4, "piros"); panelok.add(pn5, "cián); panelok.add(pn6, "kék"); panelok.add(pn7, "zöld"); panelok.add(pn8, "pink"); panelok.add(pn9, "mályva"); panelok.add(pn10, "fekete"); void btelso_actionperformed(actionevent e) { cl.first(panelok); void btutolso_actionperformed(actionevent e) { cl.last(panelok); void btelozo_actionperformed(actionevent e) { cl.previous(panelok); void btkov_actionperformed(actionevent e) { cl.next(panelok); Késztette: Csöndes Emese 47 Késztette: Csöndes Emese 48 8

2.4 GridBagLayout elrendezés Rugalmas elrendezés menedzser. Rendszertelen rácsszerkezetben helyezi el a komponenseket. Egy komponens akár egy, akár több cellát fedhet le. Egy cella csak egy komponenshez tartozhat. A komponens elhelyezkedésének meghatározását segíti a GridBagConstrains osztály objektuma. tul. komp. bt1 bt2 bt3 bt4 bt5 x 2 2 1 0 0 y 3 1 1 0 1 w 2 2 1 4 1 h 1 2 3 1 3 wx 0.0 0.0 0.0 0.0 0.0 wy 0.0 0.0 0.0 0.0 0.0 anchor CENTER CENTER CENTER CENTER CENTER HORIZONTAL BOTH fill VERTICAL HORIZONTAL VERTICAL insets 0,0,0,0 0,0,0,0 0,0,0,0 0,0,0,0 0,0,0,0 dx 0 0 0 0 0 dy 0 0 0 0 0 Késztette: Csöndes Emese 49 Késztette: Csöndes Emese 50 2.5 ScrollPaneLayout elrendezés 9 részre oszlik Késztette: Csöndes Emese 51 Ezt az elrendezést használja a JScrollPane. Késztette: Csöndes Emese 52 3. Speciális panelek 3.1 Többoldalas panel 3.2 Kettéosztható panel 3.3 Görgethető panel 3.4 Többrétegű panel 3.5 Belső ablakot tartalmazó panel Késztette: Csöndes Emese 53 Többoldalas panel, mely egymás elé helyezett, fülek segítségével elérhető panelokból áll. Kettéosztható panel, mely egy területen két panelt jelenít meg egymás mellett, vagy egymás alatt. Beállítható, hogy a panelek hogyan osztozzanak a területen. Görgethető panel, mely adott területét mutatja csak a teljes panelnek, a többi rész görgetés segítségével tehető láthatóvá. Többrétegű panel, mely a rajta elhelyezett panelokat rétegekként kezeli, hozzájuk prioritást rendel, ami meghatározza a panelok sorrendjét, és ez által a látható területeket is. Belső ablakot tartalmazó panel, mely a többablakos megjelenítést teszi lehetővé. Késztette: Csöndes Emese 54 9

3.1 Többoldalas panel - JTabbedPane Egymás elé helyezett, fülek segítségével elérhető panelokból áll. A többoldalas panel kártyás elrendezést alkalmaz (CardLayout). Késztette: Csöndes Emese 55 Egy fül létrehozása úgy, hogy kép és felirat is legyen rajta: JPanel pnk = new JPanel(); JTabbedPane tp=new JTabbedPane(); tp.addtab("kutyák", new ImageIcon("images/D.gif"), pnk); Késztette: Csöndes Emese 56 3.2 Kettéosztható panel - JSplitPane Két komponenst szeretnénk egyidejűleg megjeleníteni úgy, hogy a láthatósági arányuk a program futása közben változtatható legyen. VERTICAL_SPLIT HORIZONTAL_SPLIT A kettéosztó panelnél a következő beállításokat kell elvégeznünk: JSplitPane splitpane = new JSplitPane(); Vízszintes felosztású legyen splitpane.setorientation( JSplitPane.VERTICAL_SPLIT); Mindkét tartományába helyezzünk el egy-egy panelt splitpane.add(pnb, JSplitPane.LEFT); splitpane.add(pnj, JSplitPane.RIGHT); A felosztás gombnyomásra maximalizálható legyen splitpane.setonetouchexpandable(true); Késztette: Csöndes Emese 57 Késztette: Csöndes Emese 58 3.3 Görgethető panel - JScrollPane Olyan esetekben alkalmazunk, mikor a látható terület nem tudja lefedni teljesen a látni kívánt területet. A görgethető panel elrendezésmenedzsere a ScrollPaneLayout. Késztette: Csöndes Emese 59 Késztette: Csöndes Emese 60 10

JViewport vonalzov=new JViewport(); JViewport vonalzof=new JViewport(); JScrollPane sp = new JScrollPane(); JLabel lbkep = new JLabel(new ImageIcon("images/kep.jpg")); JLabel lbv = new JLabel( new ImageIcon("images/vonalzoV.jpg")); JLabel lbf = new JLabel( new ImageIcon("images/vonalzoF.jpg")); lbkep.sethorizontalalignment(swingconstants.left); lbkep.setverticalalignment(swingconstants.top); vonalzov.add(lbv, null); vonalzof.add(lbf, null); sp.setrowheader(vonalzof); sp.setcolumnheader(vonalzov); sp.getviewport().add(lbkep, null); 3.4 Többrétegű panel - JLayeredPane Olyan esetekben alkalmazzuk, mikor a megjeleníteni kívánt elemek között prioritási sorrendet szeretnénk érvényesíteni. Késztette: Csöndes Emese 61 Késztette: Csöndes Emese 62 Előredefiniált rétegek 0 100 200 300 400 Késztette: Csöndes Emese 63 Késztette: Csöndes Emese 64 JLayeredPane lp = new JLayeredPane(); JLabel lb=new JLabel( üzenet ); int maxszint=0; lp.add(lb, new Integer(++maxSzint)); 3.5 Belső ablakokat tartalmazó panel JDesktopPane Ha a megszokott viselkedési forma szerint szeretnénk belső ablakainkat kezelni, akkor a választott panel a többrétegű panel egy speciális leszármazottja, a JDesktopPane legyen. lp.setlayer(lb,maxszint); Késztette: Csöndes Emese 65 Késztette: Csöndes Emese 66 11

Belső ablak létrehozása JInternalFrame( String title, // a belsőablak címe boolean resizable, // átméretezhető-e boolean closable, // bezárható-e boolean maximizable,// maximalizálható-e boolean iconifiable) // ikonizálható-e Késztette: Csöndes Emese 67 Késztette: Csöndes Emese 68 Főprogramban: JDesktopPane dp=new JDesktopPane(); dp.add(new BelsoAblak(++db)); public class BelsoAblak extends JInternalFrame { public BelsoAblak(int db) { super( +db+. Ablak, true, true, false, true); setvisible(true); A belső ablakhoz tartozó eseményfigyelő Esemény osztály InternalFrame- Event Figyelő interfész InternalFrame- Listener Felfűző metódus addinternal- FrameListener Lekezelő metódus internalframeactivated() internalframeclosed() internalframeclosing() internalframe- Deactivated() internalframe- Deiconified() internalframeiconified() internalframeopened() Késztette: Csöndes Emese 69 Késztette: Csöndes Emese 70 Az opciópanel (JOptionPane) belső ablakokra vonatkozó lehetőségei showinternalconfirmdialog( ) showinternalinputdialog( ) showinternalmessagedialog( ) showinternaloptiondialog( ) JDesktopPane - DesktopManager A DesktopManager interfész segítségével a JDesktopPane-en elhelyezett belső ablakok állapotát módosíthatjuk. Legegyszerűbb implementációját a DefaultDesktopManager osztály adja. Késztette: Csöndes Emese 71 Késztette: Csöndes Emese 72 12

Pl: JDesktopPane dp = new JDesktopPane(); DefaultDesktopManager ddm = new DefaultDesktopManager(); JInternalFrame if= new JInternalFrame( Belső ablak ); dp.setdesktopmanager(ddm); dp.add(if); if.isiconifiable(); if.seticonifiable(false); ddm.iconifyframe(if); Késztette: Csöndes Emese 73 void activateframe(jinternalframe f) void begindraggingframe(jcomponent f) void beginresizingframe(jcomponent f, int direction) void closeframe(jinternalframe f) void deactivateframe(jinternalframe f) void deiconifyframe(jinternalframe f) void dragframe(jcomponent f, int newx, int newy) void enddraggingframe(jcomponent f) void endresizingframe(jcomponent f) void iconifyframe(jinternalframe f) void maximizeframe(jinternalframe f) void minimizeframe(jinternalframe f) void openframe(jinternalframe f) void resizeframe(jcomponent f, int newx, int newy, int newwidth, int newheight) void setboundsforframe(jcomponent f, int newx, int newy, int newwidth, int newheight) Késztette: Csöndes Emese 74 4. Adatbeviteli lehetőségek 4.1 Értékkiválasztó görgetősáv JSlider 4.2 JSpinner osztály és a hozzá kapcsolódó modellek 4.3 Formázott beviteli mező JFormattedTextField 4.4 Jelszó mező JPasswordField Késztette: Csöndes Emese 75 Késztette: Csöndes Emese 76 4.1 Értékkiválasztó görgetősáv JSlider JSlider slider = new JSlider(); Hashtable sebesseg=new Hashtable(); sebesseg.put(new Integer(0), new JLabel("Stop")); sebesseg.put(new Integer(100), new JLabel("Lassú")); sebesseg.put(new Integer(500), new JLabel("Normál")); sebesseg.put(new Integer(1000), new JLabel("Gyors")); Késztette: Csöndes Emese 77 Késztette: Csöndes Emese 78 13

slider.setlabeltable(sebesseg); slider.setpaintlabels(true); slider.setorientation(jslider.vertical); slider.setpainttrack(true); slider.setpaintticks(true); slider.setminimum(0); slider.setmaximum(1000); slider.setminortickspacing(100); slider.addchangelistener(this); void slider_statechanged(changeevent e) { timer.setdelay(slider.getvalue()); 4.2 JSpinner osztály és a hozzá kapcsolódó modellek Számok megjelenítéséhez a SpinnerNumberModel osztály által meghatározott modellt érdemes választani. Dátum adatok megjelenítéséhez a SpinnerDateModel a legmegfelelőbb. Egyéb, lista szerűen felsorolt adatok megjelenítéséhez a SpinnerListModel nyújt megfelelő lehetőségeket. Késztette: Csöndes Emese 79 Késztette: Csöndes Emese 80 SpinnerDateModel Calendar naptar = Calendar.getInstance(); SpinnerDateModel sdm; Date aktdatum = naptar.gettime(); naptar.add(calendar.year, -100); Date elsodatum = naptar.gettime(); naptar.add(calendar.year, +200); Date utolsodatum = naptar.gettime(); sdm = new SpinnerDateModel(aktDatum, elsodatum, utolsodatum, Calendar.YEAR); SpinnerListModel JSpinner splista = new JSpinner(); SpinnerListModel slm; String[] listaelemek = new String[] { "Hétfő", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat", "Vasárnap"; slm = new SpinnerListModel(listaElemek); Késztette: Csöndes Emese 81 Késztette: Csöndes Emese 82 CyclingSpinnerListModel public class CyclingSpinnerListModel extends SpinnerListModel { public CyclingSpinnerListModel(Object[] values) { super(values); firstvalue = values[0]; lastvalue = values[values.length - 1]; public Object getnextvalue() { public Object getpreviousvalue() { JSpinner spkorbelista = new JSpinner(); CyclingSpinnerListModel cslm; cslm = new CyclingSpinnerListModel(listaElemek); SpinnerNumberModel JSpinner spszam = new JSpinner(); SpinnerNumberModel snm; snm = new SpinnerNumberModel(50, 0, 100, 3); Késztette: Csöndes Emese 83 Késztette: Csöndes Emese 84 14

Modellek beállítása spdatum.setmodel(sdm); splista.setmodel(slm); spkorbelista.setmodel(cslm); spszam.setmodel(snm); Késztette: Csöndes Emese 85 4.3 Formázott beviteli mező JFormattedTextField Számként, ebben az esetben a NumberFormat osztályt használjuk. Dátumként, ekkor a DateFormat osztályt hívjuk segítségül. Az adatot megjeleníthetjük: Egyéni formátumban, melyet a mask karakterek segítségével tetszés szerint határozhatunk meg. A mask összeállításában használható karaktereket a MaskFormatter osztály adja meg. Késztette: Csöndes Emese 86 NumberFormat szamforma, NumberFormat penzforma; MaskFormatter mobilforma; szamforma=numberformat.getnumberinstance(); szamforma.setminimumfractiondigits(3); penzforma=numberformat.getintegerinstance(); penzforma.setminimumfractiondigits(0); try { mobilforma = new MaskFormatter("(##)/###-##-##"); catch (ParseException ex) {.. ftfszam = new JFormattedTextField(szamForma); ftfpenz = new JFormattedTextField(penzForma); ftftel = new JFormattedTextField(mobilForma); ftfszam.addpropertychangelistener("value", this); ftfpenz.addpropertychangelistener("value", this); ftftel.addpropertychangelistener("value", this); Késztette: Csöndes Emese 87 Késztette: Csöndes Emese 88 public void propertychange(propertychangeevent e) { Object source = e.getsource(); if (source == ftfszam) { szam = ( (Number)ftfSzam.getValue()).doubleValue(); else if (source == ftfpenz) { penz = ( (Number) ftfpenz.getvalue()).longvalue(); else if (source == ftftel) { mobil = ftftel.getvalue().tostring(); Késztette: Csöndes Emese 89 Mask karakterek: Karakter # ' (aposztrof) U L A? * H Leírás Számjegy (Character.isDigit). Speciális karakterek használatához szükséges karakter. Bármely betű nagybetűs formában (Character.isUpperCase). Bármely betű kisbetűs formában (Character.isLowerCase). Bármely betű vagy szám (Character.isLetter vagy Character.isDigit). Bármely betű (Character.isLetter). Joker karakter. Akármilyen karaktert takarhat. Bármely hexadecimális karakter (0-9, a-f vagy A-F). Késztette: Csöndes Emese 90 15

Például: 4.4 Jelszó mező JPasswordField irányítószám megadása: #### vezetéknév megadása: U* általános rendszám megadása:???-### Ügyeljünk a speciális esetekre! Például léteznek egyedi rendszámok. Olyan esetekben alkalmazzuk ezt a komponenst, ha nem szeretnénk láttatni a beírt karaktereket. leütött karakter értéke megmarad egy jokerkarakter (echochar) képe jelenik meg Késztette: Csöndes Emese 91 Késztette: Csöndes Emese 92 5. Kijelzők JProgressBar Az osztályból létrehozott objektum a felület komponenseként jeleníthető meg. JProgressMonitor Az osztályból létrehozott objektum külön dialógusablakban jelenik meg. Késztette: Csöndes Emese 93 Késztette: Csöndes Emese 94 6. Vezérlési technikák 6.1 Felbukkanó menü 6.1 Felbukkanó menü Komponensekhez rendelt menü. 6.2 Eszközsor 6.3 Előre definiált eseményfigyelők Késztette: Csöndes Emese 95 Késztette: Csöndes Emese 96 16

Elhelyezkedésük függhet: az adott komponenstől, az egér aktuális pozíciójától, de egy tetszőleges koordinátában is megjeleníthetjük őket. Nem láthatók állandóan, felbukkanásuk valamely eseményhez kapcsolódik. Szerkezetét tekintve ugyanolyan, mint az általános menü. A felbukkanó menü egér eseményének hatására jelenik meg abban az esetben, ha van megjeleníthető példánya. if (e.ispopuptrigger()) { popup.show(e.getcomponent(),e.getx(), e.gety()); A saját eseményeit általában nem szokták alkalmazni, hiszen azok csak a megjelenés, eltűnés, megszűnés állapotot kezelik le. Késztette: Csöndes Emese 97 Késztette: Csöndes Emese 98 EsemOsztály Figyelő interfész Felfűző metódus Lekezelő metódus 6.2 Eszközsor PopupMenu- Event PopupMenu- Listener addpopupmenu- Listener popupmenucanceled popupmenuwillbecome- Invisible popupmenuwillbecome- Visible Az eszközsor ToolBarLayout elrendezést használ, mely a FlowLayout elrendezésmenedzser leszármazottja. http://java.sun.com/developer/techdocs /hi/repository/ Késztette: Csöndes Emese 99 Késztette: Csöndes Emese 100 6.3 Előre definiált eseményfigyelők Egy alkalmazás számos eseményt kezel, például egéreseményeket, billentyűeseményeket, Ugyanazt az eseményt a grafikus felület különböző helyeiről generálhatjuk, például menükből, eszközsorból... Az Action interfész egy speciális eseményfigyelőt (ActionListener) valósít meg. Legegyszerűbb implementációját az AbstractAction osztály adja. Késztette: Csöndes Emese 101 Késztette: Csöndes Emese 102 17

Az AbstractAction osztálynak a következő leszármazottai vannak: TextAction DefaultEditorKit.BeepAction DefaultEditorKit.CopyAction DefaultEditorKit.CutAction DefaultEditorKit.DefaultKeyTypedAction DefaultEditorKit.InsertBreakAction DefaultEditorKit.InsertContentAction DefaultEditorKit.InsertTabAction DefaultEditorKit.PasteAction StyledEditorKit.StyledTextAction Késztette: Csöndes Emese 103 StyledEditorKit.StyledTextAction StyledEditorKit.AlignmentAction StyledEditorKit.BoldAction StyledEditorKit.FontFamilyAction StyledEditorKit.FontSizeAction StyledEditorKit.ForegroundAction StyledEditorKit.ItalicAction StyledEditorKit.UnderlineAction Késztette: Csöndes Emese 104 Az előre definiált eseményfigyelőket az alkalmazásainkban szabadon felhasználhatjuk. mbetumeret.add(new StyledEditorKit. FontSizeAction("12", 12)); mbetuszin.add(new StyledEditorKit. ForegroundAction("Zöld", Color.green)); A stílusjegyeknél külön változóba lementjük az akciót, átnevezzük, és csak ezután helyezzük el a menün. action = new StyledEditorKit.BoldAction(); action.putvalue(action.name, "Félkövér"); mbetustilus.add( mifelkover=new JMenuItem(action)); Késztette: Csöndes Emese 105 Késztette: Csöndes Emese 106 A betűtípusokat lekérjük a rendszertől, és az így kapott eredmény alapján töltjük fel a menüt. String[] fontok = Toolkit.getDefaultToolkit().getFontList(); for (int i = 0; i < fontok.length; i++) { mbetutipus.add( new StyledEditorKit.FontFamilyAction( fontok[i],fontok[i])); Késztette: Csöndes Emese 107 7. Fastruktúra négy elnevezést használunk a fa elemeire: gyökér (root), szülő (parent), gyerek (child), levél (leaf). Késztette: Csöndes Emese 108 18

Fastruktúra létrehozása: Objektum tömb segítségével: Objektum tömb segítségével Vektor segítségével Hasítótábla segítségével Fa csomópontok megadásával int i=0; for(char c='a'; c<='h'; c++) o[i++]=""+c; tree=new JTree(o); Késztette: Csöndes Emese 109 Késztette: Csöndes Emese 110 Vektor segítségével: Hasítótábla segítségével: for(char c='a'; c<='h'; c++) v.add(""+c); tree=new JTree(v); for (char c = 'A'; c <= 'H'; c++) { h.put("" + c, "" + c); tree = new JTree(h); Késztette: Csöndes Emese 111 Késztette: Csöndes Emese 112 Fa csomópontok megadásával: Változtatható fa csomópontjának létrehozása: sz1 = new DefaultMutableTreeNode("B"); sz2 = new DefaultMutableTreeNode("E"); Csomópontok egymáshoz rendelése: sz1.add(sz2); tree = new JTree(dmtn); Késztette: Csöndes Emese 113 DefaultMutableTreeNode dmtn, sz1, sz2; dmtn = new DefaultMutableTreeNode("A"); sz1 = new DefaultMutableTreeNode("B"); sz2 = new DefaultMutableTreeNode("E"); sz1.add(sz2); sz2 = new DefaultMutableTreeNode("F"); sz1.add(sz2); dmtn.add(sz1); sz1 = new DefaultMutableTreeNode("C"); sz2 = new DefaultMutableTreeNode("G"); sz1.add(sz2); dmtn.add(sz1); sz1 = new DefaultMutableTreeNode("D"); sz2 = new DefaultMutableTreeNode("H"); sz1.add(sz2); dmtn.add(sz1); tree = new JTree(dmtn); Késztette: Csöndes Emese 114 19

Fa adatmodellje TreeModel interfész definiálja információkat kaphatunk: az adott csomópont gyerekeiről, az adott gyerekek szüleiről, a gyökérről Legegyszerűbb implementációját a DefaultTreeModel osztály adja Fa szerkezete változtatható a fa elemeit a MutableTreeNode interfész valósítja meg. végleges a fa elemeit a TreeNode interfész valósítja meg. Késztette: Csöndes Emese 115 Késztette: Csöndes Emese 116 Fa adatainak kijelölése, kijelölések nyilvántartása TreeSelectionModel Kijelöléssel kapcsolatos műveletek: Az egész fára: Kijelölés módjának megadása akárhány fapont kiválasztása, DISCONTIGUOUS_TREE_SELECTION egybefüggő fapont-csoport kiválasztása, CONTIGUOUS_TREE_SELECTION egyetlen fapont kiválasztása SINGLE_TREE_SELECTION. Egész fa kijelölése. Kijelölés megszüntetése. Késztette: Csöndes Emese 117 Késztette: Csöndes Emese 118 Megjelenítés Fapontokra: Kijelölt fapontok Kijelölt fapontok száma Kijelölt fapontok indexe Adott fapont ki van-e választva Legkisebb/legnagyobb kijelölt index Hozzáadhatunk új fapontot a kijelöléshez Megszüntethetjük a kijelölést fapontokon Módosíthatjuk a kijelölés összetételét TreeCellRenderer Legegyszerűbb implementációját a DefaultTreeCellRenderer osztály adja. Késztette: Csöndes Emese 119 Késztette: Csöndes Emese 120 20

Szerkesztés TreeCellEditor Legegyszerűbb implementációját a DefaultTreeCellEditor osztály adja. Fa alapbeállításai dtcr = new DefaultTreeCellRenderer(); dtce = new DefaultTreeCellEditor(this,dtcr); root = new DefaultMutableTreeNode("gyökér"); treemodel = new DefaultTreeModel(root); setmodel(treemodel); seteditable(true); getselectionmodel().setselectionmode (TreeSelectionModel.SINGLE_TREE_SELECTION); setautoscrolls(true); setcelleditor(dtce); setcellrenderer(dtcr); Késztette: Csöndes Emese 121 Késztette: Csöndes Emese 122 dtcr.setbackgroundselectioncolor(color1); dtcr.settextselectioncolor(color2); dtcr.setbackgroundnonselectioncolor(color3); dtcr.settextnonselectioncolor(color4); dtcr.setopenicon(icon1); dtcr.setclosedicon(icon2); dtcr.setleaficon(icon3); Késztette: Csöndes Emese 123 Késztette: Csöndes Emese 124 8. Táblázat Minden egyes oszlopnak van: Összetartozó adatok megjelenítése. Sorokból (rekordokból) és oszlopokból áll. Egy oszlopban azonos típusú adatok szerepelnek. Egy sor összetartozó adatokat tartalmaz. Késztette: Csöndes Emese 125 típusa, ami akár primitív akár referencia típusú lehet; fejléce, mely szöveges formában megadja a tartalmazott adatok rövid leírását; megjelenítése, melyet a TableCellRenderer interfész segítségével határozhatunk meg; szerkeszthetősége, melyet a TableCellEditor interfész segítségével határozhatunk meg. Késztette: Csöndes Emese 126 21

Az oszlop fejléce A JTableHeader osztály valósítja meg. A fejléc által átméretezhető vagy elmozgatható egy oszlop. Fejlécre kattintással sorba rendezhetők a táblázat sorai (rekordjai) az adott oszlop szerint. A táblázatok oszlopait a TabelColumnModel reprezentálja. Az oszlopmodellen keresztül lehet a táblázathoz oszlopot hozzáadni, meglévő oszlopot törölni, oszlopok kiválasztását szabályozni. Késztette: Csöndes Emese 127 Kijelölés A táblázat adatainak kijelöléséért illetve a kijelölések nyilvántartásáért a ListSelectionModel a felelős. Késztette: Csöndes Emese 128 Kijelöléssel kapcsolatos műveletek: Az egész táblára: Kijelölés módjának megadása (sorok kijelölése egyesével, összefüggő vagy független intervallumban történjen). Egész tábla kijelölése. Kijelölés megszüntetése. Sorokra illetve oszlopokra: Lekérdezhetjük a táblázat egy kijelölt sorát/oszlopát. Lekérdezhetjük a táblázat kijelölt sorait/oszlopait. Lekérdezhetjük a kijelölt sorok/oszlopok számát. Lekérdezhetjük, hogy egy adott sor/oszlop ki van-e jelölve. Hozzáadhatunk újabb sorokat/oszlopokat a kijelöléshez. Megszüntethetjük a kijelölést sorokon/oszlopokon. Módosíthatjuk a kijelölés intervallumát. Késztette: Csöndes Emese 129 Késztette: Csöndes Emese 130 Adat reprezentálás Cellára: Lekérdezhetjük, hogy egy adott cella ki van-e jelölve. A táblázat adatainak reprezentálására a TableModel interfész használható. A TableModel interfész által információkat kaphatunk: a táblázat sorainak/oszlopainak számáról, az oszlopok nevéről, az oszlopok adatainak típusáról, a táblázat celláinak értékeiről. Figyelhetjük a táblázat sorain/oszlopain végzett változtatásokat. Késztette: Csöndes Emese 131 Késztette: Csöndes Emese 132 22

Az adathordozó osztály Feladat TableTest Hozzunk létre egy adathalmazt. A következő adatokat tároljuk benne: sorszám, név, kor, fénykép, kedvenc szín, tagság. Az adatokat táblázatban jelenítsük meg. Az adatok szerkeszthetők: - a név legördülő listán, - a fénykép fájldialóguson, - a szín színdialóguson, - a tagság jelölőmezőn keresztül. Az adatokat véletlenszám generátor segítségével állítjuk elő. Késztette: Csöndes Emese 133 Késztette: Csöndes Emese 134 Táblázat készítése: Object tömbbel Object[ ][ ] adatok=new Object[10][6]; Object[] oszlopok=new Object[6]; String[] nevek=new String{ ; String[] oszlopnevek=new String[]{"Sorszám","Név", "Kor", "Kép", "Szín", "Tag"; for(int i=0; i<10; i++){ Object[] adat=new Adat(i, nevek).getadattomb(); for(int j=0; j<oszlopnevek.length; j++) adatok[i][j]=adat[j]; for(int i=0; i<oszlopnevek.length; i++) oszlopok.add(oszlopnevek[i]); JTable table=new JTable(adatok,oszlopnevek); Késztette: Csöndes Emese 135 Vectorral Vector adatok=new Vector(); Vector oszlopok=new Vector(); String[] nevek=new String{ ; String[] oszlopnevek=new String[]{"Sorszám","Név", "Kor", "Kép", "Szín", "Tag"; for(int i=1; i<=10; i++) adatok.add(new Adat(i,nevek).getAdatVektor()); for(int i=0; i<oszlopnevek.length; i++) oszlopok.add(oszlopnevek[i]); tablazat=new JTable(adatok,oszlopok); Késztette: Csöndes Emese 136 Új sor felvétele szükségünk van a TableModelre, Vagy lekérjük a táblázattól, vagy létrehozunk egyet úgy, hogy alkalmazzuk a legegyszerűbb implementációját a DefaultTableModelt. table=new JTable(adatok,oszlopnevek); helyett dtm=new DefaultTableModel(adatok,oszlopnevek); table.setmodel(dtm); az új adat hozzáadása ilyen egyszerűvé válik: Adat adat=new Adat(++db, nevek); dtm.addrow(adat.getadatvektor()); Késztette: Csöndes Emese 137 Késztette: Csöndes Emese 138 23

Sor törlése Ki kell tudnunk jelölni. A tábla kiválasztott sorainak vezérlését a ListSelectionModel interfész végzi. A kijelöléskor ListSelectionEvent esemény keletkezik. EsemOsztály ListSelection -Event Figyelő interfész ListSelection- Listener Felfűző metódus Lekezelő metódus addlistselection valuechanged -Listener Késztette: Csöndes Emese 139 dlsm=new DefaultListSelectionModel(); dlsm.setselectionmode( DefaultListSelectionModel.SINGLE_SELECTION); dlsm.addlistselectionlistener( new javax.swing.event.listselectionlistener() { public void valuechanged(listselectionevent e) { ); table.setselectionmodel(dlsm); dtm.removerow(dlsm.getminselectionindex()); Késztette: Csöndes Emese 140 Adatmodell A táblázat adatmodelljét a TableModel interfész reprezentálja. Hozzunk létre egy osztályt, melynek őse a DefaultTableModel osztály lesz. Ne felejtsük el átállítani a táblázat modelljét az új modellre. dtm=new TablazatModel(adatok,oszlopnevek); table.setmodel(dtm); Adatok szerkesztése Szerkeszteni kétféleképpen lehet az adatokat: helyben dialógus ablakban (javasolt) A táblázat cellái alapértelmezésben helyben szerkeszthetőek JTextField komponens segítségével. A szerkeszthetőség vezérlését a TableCellEditor interfész végzi. Késztette: Csöndes Emese 141 Késztette: Csöndes Emese 142 Egyes típusok adatainak megjelenítéséhez a következő komponenseket használják általában: Boolean Jelölőmező (JCheckBox). Number Jobbra igazított címke (JLabel). Double, Float Formázott beviteli mező (JFormattedTextField) tizedesjegyek számának megadásával. Date Címkében megjelenített dátum formátum vagy formázott beviteli mező (DateFormat). ImageIcon, Icon Középre igazított címke. Object Címkében jelenítjük meg az objektum szöveges reprezentációját. Adatmodellt reprezentáló osztályunkban írjuk felül a public Class getcolumnclass(int columnindex) { return Object.class; metódust úgy, hogy valós osztályt adjon vissza (ne Object-et minden esetbe). Létrehozunk egy JComboBoxot, feltöltjük értékekkel, majd megadjuk a táblázatnak, hogy az adott oszlop ezt a szerkesztési módot alkalmazza. Késztette: Csöndes Emese 143 Késztette: Csöndes Emese 144 24

JComboBox cb=new JComboBox(nevek); TableColumn nevoszlop= table.getcolumnmodel().getcolumn(1); nevoszlop.setcelleditor(new DefaultCellEditor(cb)); Késztette: Csöndes Emese 145 Késztette: Csöndes Emese 146 9. Dokumentumkezelés A szöveg komponenseket három csoportra oszthatjuk: egysoros beviteli mezők JTextField JPasswordField JFormattedTextField többsoros beviteli mező JTextArea stílusos szövegek megjelenítését végző komponensek JEditorPane JTextPane Késztette: Csöndes Emese 147 Késztette: Csöndes Emese 148 A Javaban háromféle dokumentumtípus kezelésére van lehetőség: sima szöveg (text/plain) kezelését a DefaultEditorKit osztály segíti rtf szöveg (text/rtf) kezelését az RTFEditorKit osztály segíti html szöveg (text/html) kezelését a HTMLEditorKit osztály segíti Késztette: Csöndes Emese 149 Késztette: Csöndes Emese 150 25

Két új esemény lekezelésére is szükség lehet, ha dokumentumokat szeretnénk kezelni: A szöveg kurzor eseményt kezelő CaretEvent osztályra, ha a szöveg kurzor mozgását szeretnénk követni. A hivatkozásokat kezelő HyperlinkEvent osztályra, mely hivatkozások megszokott módon való használatát teszi lehetővé a html fájlokban. EsemOsztály CaretEvent Hyperlink- Event Figyelő interfész CaretListener Hyperlink- Listener Felfűző metódus addcaretlistener addhyperlink- Listener Lekezelő metódus caretupdate hyperlinkupdate Késztette: Csöndes Emese 151 Késztette: Csöndes Emese 152 Feladat A feladat megoldásához JEditorPane komponenst kell alkalmaznunk. Az objektum által megjelenített fájlt egy fájldialógus ablak segítségével adjuk meg. Az URL osztály egy objektumát hozzuk létre a fájl elérési útjának megadásával. File f; URL url = new URL("file:" + f.getabsolutepath()); Változtassuk meg az editorpane által megjelenítendő oldalt. JEditorPane ep = new JEditorPane(); ep.setpage(url); Késztette: Csöndes Emese 153 Késztette: Csöndes Emese 154 A hivatkozás és az egér kapcsolata Az egér nincs a hivatkozás fölött Az egér a hivatkozás fölé ér HyperlinkEvent.EventType.ENTERED Az egérrel a hivatkozásra kattintunk HyperlinkEvent.EventType.ACTIVATED Elhagyjuk az egérrel a hivatkozást HyperlinkEvent.EventType.EXITED Késztette: Csöndes Emese 155 Késztette: Csöndes Emese 156 26

Alkalmazott stílusjegyek: alap - alapértelmezésben használt stílus, de Dialog betűtípussal felkover - alap + félkövér dolt - alap + dőlt alahuzott- alap + aláhúzott kicsi - alap, de 8-as betűmérettel nagy - alap, de 16-os betűmérettel piros - alap, de piros betűszínnel Kek - alap, de kék betűszínnel boci - középre igazított boci.jpg kép Megvalósítás: Meg kell adnunk a szöveget, a stílusokat, és össze kell párosítanunk őket (tömbök). A boci stílusnál figyeljünk arra, hogy szerepeljen a stílushoz megjelenítendő szöveg. Lekérdezzük a dokumentumok megjelenítéséhez használt stílust, majd ebből kiindulva megadjuk az általunk használt alap stílus tulajdonságait. Erre fogjuk felépíteni a többi stílusunkat. Késztette: Csöndes Emese 157 Késztette: Csöndes Emese 158 JTextPane tp = new JTextPane(); Style def=stylecontext.getdefaultstylecontext(). getstyle(stylecontext.default_style); Style alap=tp.addstyle("alap",def); StyleConstants.setFontFamily(alap,"Dialog"); Style akts=tp.addstyle("felkover",alap); StyleConstants.setBold(aktS,true); akts=tp.addstyle("dolt",alap); StyleConstants.setItalic(aktS,true); akts=tp.addstyle("alahuzott",alap); StyleConstants.setUnderline(aktS,true); Késztette: Csöndes Emese 159 aktstilus=tp.addstyle("kicsi",alap); StyleConstants.setFontSize(aktS,8); aktstilus=tp.addstyle("nagy",alap); StyleConstants.setFontSize(aktS,16); aktstilus=tp.addstyle("piros",alap); StyleConstants.setForeground(aktS,Color.red); aktstilus=tp.addstyle("kek",alap); StyleConstants.setForeground(aktS,Color.blue); aktstilus=tp.addstyle("boci",alap); StyleConstants.setAlignment(aktS, StyleConstants.ALIGN_CENTER); StyleConstants.setIcon(aktS,new ImageIcon("images/boci.jpg")); Késztette: Csöndes Emese 160 Már csak a stílusokat és a szövegrészeket össze kell párosítanunk, és a textpane dokumentumához hozzáadnunk. Document doc=tp.getdocument(); try{ for(int i=0; i<szoveg.length; i++){ doc.insertstring(doc.getlength(), szoveg[i],tp.getstyle(stilus[i])); catch(badlocationexception ex){ System.out.println("Nem lehet beilleszteni a szöveget!"); Késztette: Csöndes Emese 161 10. Alkalmazások közötti adatcsere A Drag and Drop grafikus manipulációk segítségével végzett adatátvitel az alkalmazások között, vagy az alkalmazás egyik részéből a másikba. Platformfüggetlenség Forrás Cél Késztette: Csöndes Emese 162 27

LJist Adatátvitel támogatása JTable JTree Komponens JColorChooser ** JEditorPane JFileChooser *** JFormattedTextField JPasswordField JTextArea JTextField JTextPane Drag Copy * Drag Move * Drop Cut Késztette: Csöndes Emese 163 Copy Paste * Az adott komponensnél a setdragenabled(true) érték beállítása mellett. ** Az importált, exportált adat típusa java.awt.color. *** Fájlnév kerül exportálásra, a java.io.file objektum exportálása nem engedélyezett. Késztette: Csöndes Emese 164 Adatátvitel Az Adatátvitel (cut and paste) alkalmazások közötti vagy egy alkalmazás különböző részei közötti szöveges, grafikus, vagy bármilyen adat átvitele. Szükség van hozzá egy virtuális vágólapra, melyen ideiglenesen el lehet helyezni a mozgatni kívánt adatot. A drag and drop műveletnél többféle lehetőségünk van az átvinni kívánt adat meghatározására. Alapértelmezés: a kijelölt elem szöveges reprezentációja. Késztette: Csöndes Emese 165 Késztette: Csöndes Emese 166 Egyéb tulajdonság átvitele Komponenstől független szöveg átvitele component.settransferhandler( new TransferHandler("text")); A bemenetként átadott objektum a következő formátumú: public TransferHandler(String property) A komponens actioncommand tulajdonságának megadjuk a kívánt szöveget, és ezt a tulajdonságot jelöljük ki az átvitelhez. Késztette: Csöndes Emese 167 Késztette: Csöndes Emese 168 28

Mozgathatóság feltétele Ahhoz, hogy egy objektum mozgatható legyen: Implementálnia kell a java.awt.datatransfer.transferable interfészt. Meg kell határoznia egy adatformátumot. Minden adatformátum esetében három információt kell megadni: a formátum logikai nevét, a formátum hivatalos nevét, egy reprezentációs osztályt az adatformátumhoz, mely magát az adatmozgatást teszi lehetővé. Reprezentációs osztály Meghatározza, hogy milyen típusú objektum kerül átadásra a küldő és a fogadó között. A DataFlavor osztály adatformátumot reprezentál. gettransferdata() A Java osztály típusú visszatérési értékeit adja. A DataFlavor objektum használatával egyszerűen összehasonlíthatóvá válnak a különböző adatformátumok. A meglévő két formátum: DataFlavor.stringFlavor DataFlavor.plainTextFlavor Késztette: Csöndes Emese 169 Késztette: Csöndes Emese 170 Vágólap Kivágás, másolás, beillesztés A Vágólap alkalmazásból kivágott, vagy kimásolt adatok tárolására leggyakrabban használt tárolóhely. A legtöbb alkalmazásból elérhető. Vágólap segítségével valósítható meg az adatáramlás Java és nem Java alkalmazások között. java.awt.datatransfer.clipboard java.awt.toolkit.getsystemclipboard() Késztette: Csöndes Emese 171 Késztette: Csöndes Emese 172 void btcut_actionperformed(actionevent e) { ta.cut(); void btcopy_actionperformed(actionevent e) { ta.copy(); void btpaste_actionperformed(actionevent e) { ta.paste(); Vágólap műveletek public Transferable getcontents(object requestor) Az aktuális vágólap tartalmát adja vissza. Ez vagy null, vagy az adat. A metódus IllegalStateException kivételt dob, ha a vágólap nem elérhető. public void setcontents(transferable contents, ClipboardOwner owner) Az aktuális vágólap tartalmát átírjuk. Hogy ezt megtehessük az osztályunknak implementálnia kell a ClipboardOwner interfészt. Késztette: Csöndes Emese 173 Késztette: Csöndes Emese 174 29

Transferable interfész public DataFlavor[ ] gettransferdataflavors() public boolean isdataflavorsupported( DataFlavor flavor) public Object gettransferdata( DataFlavor flavor) public DataFlavor[ ] gettransferdataflavors() Megadja az alkalmazható DataFlavor-öket úgy, hogy elsőként említi a legspeciálisabbat, és utolsóként a legáltalánosabbat. pl: DataFlavor[] tomb=adat.gettransferdataflavors(); for(int i=0; i<tomb.length; i++) System.out.println(tomb[i]). gethumanpresentablename()); Késztette: Csöndes Emese 175 Késztette: Csöndes Emese 176 public boolean isdataflavorsupported( DataFlavor flavor) Megadja, hogy a vágólapról lekérdezett adatra alkalmazható-e az adott DataFlavor vagy nem. pl: System.out.println(adat.isDataFlavorSupported( DataFlavor.stringFlavor)); public Object gettransferdata( DataFlavor flavor) Visszaadja a vágolapon található adatot a kívánt formában. A flavor értékeinek a DataFlavor osztály mezőit adhatjuk meg, melyek közül leginkább a DataFlavor.StringFlavor-t használjuk, mely Stringként adja vissza az adatot. Két kivétel keletkezhet: - IOException: Ha az adat már nem kérhető el. - UnsupportedFlavorException: Ha az igényelt flavor nem támogatott. Késztette: Csöndes Emese 177 Késztette: Csöndes Emese 178 Clipboard cb = java.awt.toolkit.getdefaulttoolkit().getsystemclipboard(); ta.append("\nnév "+cb.getname()+"\n"); Transferable athelyezheto = cb.getcontents(this); ta.append("adattartalmak formái (flavors): "); DataFlavor[] formak = athelyezheto.gettransferdataflavors(); for (int i = 0; i < formak.length; i++) { ta.append("\n "+i+": " + formak[i].gethumanpresentablename()); ta.append("\n"); try { ta.append("adattartalom szöveges formája: " + athelyezheto.gettransferdata(dataflavor.stringflavor) + "\n"); catch (Exception ex) { ta.append("a vágólap tartalmának nincs szöveges formája.\n"); ta.setcaretposition(ta.gettext().length()); 11. Java babok Tulajdonságai Kódolási konvenciók Kapcsolt és kényszerített tulajdonságok Betekintés Késztette: Csöndes Emese 179 Késztette: Csöndes Emese 180 30

Komponens Komponens alapú programozás: Újrafelhasználható szoftver. Egy komponens lehet akár osztály, akár objektum. A szoftverfejlesztő készíthet saját komponenst is, amelyet rátehet a komponens palettára. Egy komponensnek vannak tulajdonságai (properties), metódusai (method) és eseményei (events). Késztette: Csöndes Emese 181 Programkészítés kész komponensek felhasználásával. A szoftverfejlesztő az újrafelhasználható komponenseket adaptálja az adott környezetben, és megteremti a szükséges kapcsolatokat a komponensek között. Késztette: Csöndes Emese 182 Java bab Tulajdonságai A Java bab (Java bean) olyan újra felhasználható Java komponens, amely megadja a lehetőséget arra, hogy egy fejlesztőeszközben vizuálisan manipulálható legyen. Felületfüggetlen. Bármely Java objektum implementálható JavaBean-ként. Vizuálisan manipulálhatók. Általános viselkedési forma szerint működik. Képes információt szolgáltatni önmagáról. Késztette: Csöndes Emese 183 Késztette: Csöndes Emese 184 A Java bab lehet felhasználó felület elem, menükomponens, adathozzáférési komponens és egyéb. Az ilyen formán előállított komponensek lehetnek egyszerű vagy összetett, kis vagy nagyméretű komponensek, lehetnek grafikus vagy láthatatlan komponensek, lehetnek például információhordozó vagy algoritmikus komponensek is. Késztette: Csöndes Emese 185 Késztette: Csöndes Emese 186 31

A JavaBean komponensmodell kódolási konvenciói: Osztály: publikus, és van egy publikus, paraméter nélküli konstruktora. Tulajdonságok: logikai érték lekérdezése: public boolean is<propertyname>(); egyéb érték lekérdezése: public <PropertyType> get<propertyname>(); módosítás: public void set<propertyname> (<PropertyType> pt); tömb egy elemére: public <PropertyElement> get<propertyname>( int index); public void set<propertyname> (int index, <PropertyElement> e); egész tömbre: public <PropertyType>[] get<propertyname>(); public void set<propertyname> (<PropertyType[] a); Késztette: Csöndes Emese 187 Késztette: Csöndes Emese 188 Kapcsolt és kényszerített tulajdonságok Eseménykezelés: public void add<eventlistenertype>listener (<EventListenerType>Listener x); public void remove<eventlistenertype>listener (<EventListenerType>Listener x); Kapcsolt tulajdonságról beszélünk, ha egy tulajdonság megváltoztatásáról egy másik komponensnek is tudnia kell. Kényszerített tulajdonságról beszélünk, ha egy tulajdonság megváltoztatásáról egy másik komponensnek is tudnia kell, és az értesített komponens döntési joggal rendelkezik. Azaz lehetősége van a tulajdonság változtatásának jóváhagyására (validációjára). Késztette: Csöndes Emese 189 Késztette: Csöndes Emese 190 Betekintés EsemOsztály Property- Change- Event Property- Change- Event Figyelő interfész Property- Change- Listener Vetoable- Change- Listener Felfűző metódus addproperty- Change- Listener addvetoable- Change- Listener Lekezelő metódus property- Change vetoable- Change Betekintésnek nevezzük azt a folyamatot, amikor egy osztály (környezet) megvizsgál egy másik osztályt, hogy: milyen tulajdonságokat, metódusokat és eseményeket támogat. Ezen információkat kétféleképpen állíthatjuk elő, és tehetjük elérhetővé: tükrözés vagy BeanInfo osztály létrehozásával. Késztette: Csöndes Emese 191 Késztette: Csöndes Emese 192 32

Tükrözés segítségével lehet lekérdezni, hogy milyen mezőket, metódusokat és konstruktorokat támogat egy bean. A tervezési minták ezen információk alapján, az elnevezési konvenciókból kiindulva megállapítják, hogy a bean milyen tulajdonságokat, eseményeket és metódusokat tartalmaz. Ezt a folyamatot nevezzük betekintésnek. A tükrözés megvalósítását a java.lang.reflect csomag Field, Method, Array, Modifier, Constructor osztályai által valósíthatjuk meg. A Field, a Method és a Constructor osztályok állandóak, példányaikon keresztül lehet információt szerezni a különböző objektumokról. Késztette: Csöndes Emese 193 Késztette: Csöndes Emese 194 A BeanInfo osztály leírja a beant. Ebben az osztályban bármi megadható a beanről, beleértve annak viselkedését, tulajdonságait, metódusait, eseményeit és bármely más információt. Itt szokták szerepeltetni például a beanhez tartozó ikonokat is. Késztette: Csöndes Emese 195 33