Alkalmazásfejlesztési technológia
Vizsgakövetelmények
Magasabb szintű komponensek
Tanár: Csöndes Emese E-mail:
[email protected]
Felkészülést támogató anyagok
Adatbázis-kezelés
Tanár: Seres Iván E-mail:
[email protected]
Vizsga
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
1
Magasabb szintű komponensek 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
3
1.1 Komponensek kinézetének meghatározása
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
2
1.1 1.2 1.3 1.4 1.5
2005.11.28.
Komponensek kinézetének meghatározása Menü megjelenítésének finomítása Szegélyezés Segédszöveg HTML-t értelmező komponensek
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
4
Feladat - RendererTeszt
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.
2005.11.28.
Elméleti rész: Teszt Gyakorlati rész: Kötelező feladat bemutatása
1. Megjelenítési technikák
Megjelenítési technikák (szegélyek, segédszöveg…) Elrendezési stratégiák (kártyás, box…) Speciális panelek (füles, többrétegű, görgető…) Adatbeviteli lehetőségek (speciális szövegmezők…) Kijelzők (állapotjelző, nyomkövetés) Vezérlési technikák (felbukkanó menü, eszközsor…) Fastruktúra Táblázat Dokumentumkezelés (stílusos szöveg kezelése) Alkalmazások közötti adatcsere (drag and drop technika) Java babok
2005.11.28.
http://www.gdf.hu/Segedletek/270Fo.htm Alkalmazásfejlesztési technológiák tantárgynál
5
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)
2005.11.28.
Alkalmazásfejlesztési technológia 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(); ...
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
7
for(int i=0; i
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
8
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.
9
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
10
11
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
12
Osztálydiagram
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
2
public class ListaMegjelenito1 extends JLabel implements ListCellRenderer {
ListCellRenderer interfész Csomag: javax.swing Deklaráció: public interface ListCellRenderer Metódusa public Component getListCellRendererComponent(
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; }
JList list, Object value, int index, boolean isSelected, boolean cellHasFocus ) 2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
}
13
Saját rajzos megjelenítése
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
15
setLayoutOrientation(…)
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
JList osztály
1.2 Menü megjelenítésének finomítása
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)
14
Lista elemeinek elrenedzé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); } 2005.11.28.
2005.11.28.
16
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ó.
Beállítja, hogy a lista elemeit az általunk meghatározott formában jelenítse meg.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
17
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
18
3
Box Háromféle megvalósítása van:
Box
Glue
Strut
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
19
2005.11.28.
20
menusor.add(mFajl); menusor.add(mSzerk); menusor.add(mBeall); menusor.add(Box.createHorizontalGlue()); menusor.add(mSugo); menusor.add(mKi);
Mindkét, vagy a kitüntetett irány maximálisan elfoglalható területét veszi fel méretként.
Strut
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
Az ábrán látható menü megvalósítása:
Glue
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.
Meghatározható a lefoglalt terület mérete. Akár mindkét irányba, akár csak az egyik, kitüntetett irányba.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
21
2005.11.28.
Alkalmazásfejlesztési technológia 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(…)
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
23
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.
2005.11.28.
Alkalmazásfejlesztési technológia 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 2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
25
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
26
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)
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));
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
27
EtchedBorder: vonalas 3D szegély, melynek típusa (Raised, Lowered), megadható.
2005.11.28.
static Border createEtchedBorder(int type, Color highlight, Color shadow)
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
28
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.
highlight: Color.cyan shadow: Color.blue 2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
29
2005.11.28.
Alkalmazásfejlesztési technológia 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ó
)
static TitledBorder createTitledBorder( Border border, String title, int titleJustification, int titlePosition, Font titleFont, Color titleColor)
createMatteBorder(1,3,5,7,Color.yellow) createMatteBorder(7,5,3,1, ) 2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
31
2005.11.28.
Alkalmazásfejlesztési technológia 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:
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
33
komponens használatát segítő, magyarázó információ megjelenítése, egyfajta gyors segítség nyújtás.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
34
1.5 HTML-t értelmező komponensek
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
JLabel lb=new JLabel("Itt a piros?"); lb.setToolTipText("Nem nyert! :(");
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
35
címke, segédszöveg, gomb.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
36
6
String html="Bármi megjeleníthető," +"ami HTML tagek segítségével leírható"+ "
"+ "például táblázat:
"+ ""+ "
"+ "felsorolás:
"+ "1"+ "2"+ " "; lb.setText(html);
Például:
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
37
2005.11.28.
38
- Gomb
-Segédszöveg
setToolTipText(" NYERT!!!
")
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
bt.setText("G
O
M
B
"); 39
2005.11.28.
Alkalmazásfejlesztési technológia 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).
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
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.
41
null layout BoxLayout CardLayout GridBagLayout ScrollPaneLayout
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
42
7
2.1 null elrendezés
Nincsen előre meghatározott elrendezés. Minden komponens pozícióját és méretét meg kell határoznunk.
2005.11.28.
2.2 BoxLayout elrendezés
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
43
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));
A komponenseket vízszintes, vagy függőleges irányban helyezhetjük el egymás mellé.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
44
2.3 CardLayout elrendezés
bt1.setAlignmentX((float) 0.5); bt6.setAlignmentY((float) 1.0); 2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
45
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
46
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); }
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"); 2005.11.28.
2005.11.28.
47
2005.11.28.
Alkalmazásfejlesztési technológia 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.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
49
tul. komp.
x
y
w
h
wx
bt1
2
3
2
1
0.0 0.0
CENTER HORIZONTAL 0,0,0,0
0
0
bt2
2
1
2
2
0.0 0.0
CENTER BOTH
0,0,0,0
0
0
bt3
1
1
1
3
0.0 0.0
CENTER VERTICAL
0,0,0,0
0
0
bt4
0
0
4
1
0.0 0.0
CENTER HORIZONTAL 0,0,0,0
0
0
bt5
0
1
1
3
0.0 0.0
CENTER VERTICAL
0
0
2005.11.28.
wy
anchor
fill
insets dx
0,0,0,0
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
dy
50
2.5 ScrollPaneLayout elrendezés
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
51
3. Speciális panelek
9 részre oszlik
Ezt az elrendezést használja a JScrollPane.
2005.11.28.
3.1 3.2 3.3 3.4 3.5
Többoldalas panel Kettéosztható panel Görgethető panel Többrétegű panel Belső ablakot tartalmazó panel
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
53
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
52
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é.
2005.11.28.
Alkalmazásfejlesztési technológia 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).
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);
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
55
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
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
56
A kettéosztó panelnél a következő beállításokat kell elvégeznünk:
3.2 Kettéosztható panel - JSplitPane
2005.11.28.
57
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);
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
58
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
60
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.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
59
10
3.4 Többrétegű panel - JLayeredPane
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"));
Olyan esetekben alkalmazzuk, mikor a megjeleníteni kívánt elemek között prioritási sorrendet szeretnénk érvényesíteni.
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); 2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
61
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
62
Előredefiniált rétegek 0 100 200 300 400
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
63
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
64
3.5 Belső ablakokat tartalmazó panel – JDesktopPane JLayeredPane lp = new JLayeredPane(); JLabel lb=new JLabel(„üzenet”); int maxSzint=0;
lp.add(lb, new Integer(++maxSzint));
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);
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
65
2005.11.28.
Alkalmazásfejlesztési technológia 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
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
67
Esemény osztály
public class BelsoAblak extends JInternalFrame { public BelsoAblak(int db) { super(””+db+”. Ablak”, true, true, false, true); setVisible(true); } } Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
69
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
InternalFrameEvent
2005.11.28.
Figyelő interfész InternalFrameListener
Felfűző metódus addInternalFrameListener
Lekezelő metódus internalFrameActivated() internalFrameClosed() internalFrameClosing() internalFrameDeactivated() internalFrameDeiconified() internalFrameIconified() internalFrameOpened()
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
70
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.
showInternalConfirmDialog(…) showInternalInputDialog(…) showInternalMessageDialog(…) showInternalOptionDialog(…)
2005.11.28.
68
JDesktopPane - DesktopManager
Az opciópanel (JOptionPane) belső ablakokra vonatkozó lehetőségei
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
A belső ablakhoz tartozó eseményfigyelő
Főprogramban: JDesktopPane dp=new JDesktopPane(); dp.add(new BelsoAblak(++db));
2005.11.28.
2005.11.28.
71
2005.11.28.
Alkalmazásfejlesztési technológia 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); 2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
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)
73
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
74
75
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
76
4. Adatbeviteli lehetőségek 4.1 4.2 4.3 4.4
2005.11.28.
Értékkiválasztó görgetősáv – JSlider JSpinner osztály és a hozzá kapcsolódó modellek Formázott beviteli mező – JFormattedTextField Jelszó mező – JPasswordField
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
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")); 2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
77
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
78
13
4.2 JSpinner osztály és a hozzá kapcsolódó modellek
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()); } 2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
79
SpinnerDateModel
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
81
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() { … } } 2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
Egyéb, lista szerűen felsorolt adatok megjelenítéséhez a SpinnerListModel nyújt megfelelő lehetőségeket.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
80
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);
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); 2005.11.28.
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.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
82
JSpinner spKorbeLista = new JSpinner(); CyclingSpinnerListModel cslm; cslm = new CyclingSpinnerListModel(listaElemek);
SpinnerNumberModel JSpinner spSzam = new JSpinner(); SpinnerNumberModel snm; snm = new SpinnerNumberModel(50, 0, 100, 3);
83
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
84
14
4.3 Formázott beviteli mező – JFormattedTextField Modellek beállítása
spDatum.setModel(sdm); spLista.setModel(slm); spKorbeLista.setModel(cslm);
spSzam.setModel(snm);
Az adatot megjeleníthetjük:
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
85
NumberFormat szamForma, NumberFormat penzForma; MaskFormatter mobilForma;
penzForma=NumberFormat.getIntegerInstance(); penzForma.setMinimumFractionDigits(0); try { mobilForma = new MaskFormatter("(##)/###-##-##"); } catch (ParseException ex) {…..} Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
87
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(); } } 2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
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. Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
2005.11.28.
86
ftfSzam = new JFormattedTextField(szamForma); ftfPenz = new JFormattedTextField(penzForma); ftfTel = new JFormattedTextField(mobilForma);
szamForma=NumberFormat.getNumberInstance(); szamForma.setMinimumFractionDigits(3);
2005.11.28.
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.
89
ftfSzam.addPropertyChangeListener("value", this); ftfPenz.addPropertyChangeListener("value", this); ftfTel.addPropertyChangeListener("value", this);
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
2005.11.28.
88
Mask karakterek: Karakter Leírás #
Számjegy (Character.isDigit).
' (aposztrof) Speciális karakterek használatához szükséges karakter. U
Bármely betű nagybetűs formában (Character.isUpperCase).
L
Bármely betű kisbetűs formában (Character.isLowerCase).
A
Bármely betű vagy szám (Character.isLetter vagy Character.isDigit).
?
Bármely betű (Character.isLetter).
*
Joker karakter. Akármilyen karaktert takarhat.
H
Bármely hexadecimális karakter (0-9, a-f vagy A-F).
2005.11.28.
Alkalmazásfejlesztési technológia 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: ???-###
Olyan esetekben alkalmazzuk ezt a komponenst, ha nem szeretnénk láttatni a beírt karaktereket.
Ügyeljünk a speciális esetekre! Például léteznek egyedi rendszámok.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
2005.11.28.
91
5. Kijelzők
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
92
JProgressMonitor
JProgressBar
leütött karakter értéke megmarad egy jokerkarakter (echoChar) képe jelenik meg
Az osztályból létrehozott objektum külön dialógusablakban jelenik meg.
Az osztályból létrehozott objektum a felület komponenseként jeleníthető meg.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
2005.11.28.
93
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
6. Vezérlési technikák
6.1 Felbukkanó menü
6.1
Felbukkanó menü
6.2
Eszközsor
6.3
Előre definiált eseményfigyelők
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
95
94
Komponensekhez rendelt menü.
2005.11.28.
Alkalmazásfejlesztési technológia 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.
if (e.isPopupTrigger()) { popup.show(e.getComponent(),e.getX(), e.getY()); }
Nem láthatók állandóan, felbukkanásuk valamely eseményhez kapcsolódik. Szerkezetét tekintve ugyanolyan, mint az általános menü. Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
2005.11.28.
EsemOsztály PopupMenuEvent
Figyelő interfész PopupMenuListener
2005.11.28.
97
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.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
98
6.2 Eszközsor
Felfűző metódus
Lekezelő metódus
addPopupMenuListener
popupMenuCanceled popupMenuWillBecomeInvisible popupMenuWillBecomeVisible
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
A felbukkanó menü egér eseményének hatására jelenik meg abban az esetben, ha van megjeleníthető példánya.
99
Az eszközsor ToolBarLayout elrendezést használ, mely a FlowLayout elrendezésmenedzser leszármazottja. http://java.sun.com/developer/techDocs /hi/repository/
2005.11.28.
Alkalmazásfejlesztési technológia 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 ...
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
101
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.
2005.11.28.
Alkalmazásfejlesztési technológia 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
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
103
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));
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
105
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])); } Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
107
StyledEditorKit.AlignmentAction StyledEditorKit.BoldAction StyledEditorKit.FontFamilyAction StyledEditorKit.FontSizeAction StyledEditorKit.ForegroundAction StyledEditorKit.ItalicAction StyledEditorKit.UnderlineAction
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
104
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));
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
106
7. Fastruktúra
2005.11.28.
StyledEditorKit.StyledTextAction
négy elnevezést használunk a fa elemeire:
gyökér (root), szülő (parent), gyerek (child), levél (leaf).
2005.11.28.
Alkalmazásfejlesztési technológia 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
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
int i=0; for(char c='A'; c<='H'; c++) o[i++]=""+c; tree=new JTree(o);
109
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
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);
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
111
Fa csomópontok megadásával:
tree = new JTree(dmtn);
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
112
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);
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);
2005.11.28.
2005.11.28.
110
113
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
114
19
Fa adatmodellje
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.
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
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
115
Fa adatainak kijelölése, kijelölések nyilvántartása
Az egész fára:
Kijelölés módjának megadása
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
116
Kijelöléssel kapcsolatos műveletek:
TreeSelectionModel
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
2005.11.28.
117
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.
2005.11.28.
Alkalmazásfejlesztési technológia 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
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
119
TreeCellRenderer Legegyszerűbb implementációját a DefaultTreeCellRenderer osztály adja.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
120
20
Szerkesztés
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);
TreeCellEditor Legegyszerűbb implementációját a DefaultTreeCellEditor osztály adja.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
121
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
122
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
124
dtcr.setBackgroundSelectionColor(color1); dtcr.setTextSelectionColor(color2); dtcr.setBackgroundNonSelectionColor(color3); dtcr.setTextNonSelectionColor(color4); dtcr.setOpenIcon(icon1); dtcr.setClosedIcon(icon2); dtcr.setLeafIcon(icon3); 2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
123
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.
2005.11.28.
Alkalmazásfejlesztési technológia 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.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
126
21
Az oszlop fejléce
Kijelölés
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
A táblázat adatainak kijelöléséért illetve a kijelölések nyilvántartásáért a ListSelectionModel a felelős.
oszlopot hozzáadni, meglévő oszlopot törölni, oszlopok kiválasztását szabályozni.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
127
2005.11.28.
Alkalmazásfejlesztési technológia 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:
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
129
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.
2005.11.28.
Alkalmazásfejlesztési technológia 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:
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
131
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.
2005.11.28.
Alkalmazásfejlesztési technológia 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ő.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
133
Táblázat készítése: Object tömbbel
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
Vectorral
Object[ ][ ] adatok=new Object[10][6]; Object[] oszlopok=new Object[6];
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"};
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
for(int i=1; i<=10; i++) adatok.add(new Adat(i,nevek).getAdatVektor()); for(int i=0; i
JTable table=new JTable(adatok,oszlopnevek); 2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
134
tablazat=new JTable(adatok,oszlopok); 135
2005.11.28.
Alkalmazásfejlesztési technológia 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); 2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
137
az új adat hozzáadása ilyen egyszerűvé válik:
Adat adat=new Adat(++db, nevek); dtm.addRow(adat.getAdatVektor());
2005.11.28.
Alkalmazásfejlesztési technológia 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
Figyelő interfész ListSelection ListSelection-Event Listener 2005.11.28.
Felfűző metódus
Lekezelő metódus addListSelection valueChanged -Listener
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
139
Adatmodell
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()); 2005.11.28.
A táblázat adatmodelljét a TableModel interfész reprezentálja.
dtm=new TablazatModel(adatok,oszlopnevek);
table.setModel(dtm);
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
141
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.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
Szerkeszteni kétféleképpen lehet az adatokat:
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.
2005.11.28.
140
Adatok szerkesztése
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
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.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
142
Adatmodellt reprezentáló osztályunkban írjuk felül a public Class getColumnClass(int columnIndex) { return Object.class; }
143
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.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
144
24
JComboBox cb=new JComboBox(nevek); TableColumn nevoszlop= table.getColumnModel().getColumn(1); nevoszlop.setCellEditor(new DefaultCellEditor(cb));
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
2005.11.28.
145
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
146
147
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
148
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
150
9. Dokumentumkezelés
A szöveg komponenseket három csoportra oszthatjuk:
egysoros beviteli mezők
többsoros beviteli mező
JTextField JPasswordField JFormattedTextField JTextArea
stílusos szövegek megjelenítését végző komponensek
2005.11.28.
JEditorPane JTextPane Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
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)
html szöveg (text/html)
kezelését az RTFEditorKit osztály segíti kezelését a HTMLEditorKit osztály segíti
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
149
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.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
151
Feladat
EsemOsztály
Figyelő interfész
Felfűző metódus
Lekezelő metódus
CaretEvent
CaretListener addCaretListener caretUpdate
HyperlinkEvent
HyperlinkListener
2005.11.28.
addHyperlinkListener
hyperlinkUpdate
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
152
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);
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
153
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
154
155
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
156
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
Az egérrel a hivatkozásra kattintunk
HyperlinkEvent.EventType.ENTERED HyperlinkEvent.EventType.ACTIVATED
Elhagyjuk az egérrel a hivatkozást HyperlinkEvent.EventType.EXITED
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
26
Alkalmazott stílusjegyek:
alap stílus, felkover dolt alahuzottkicsi nagy piros Kek boci -
2005.11.28.
alapértelmezésben használt de Dialog betűtípussal alap + félkövér alap + dőlt alap + aláhúzott alap, de 8-as betűmérettel alap, de 16-os betűmérettel alap, de piros betűszínnel alap, de kék betűszínnel középre igazított boci.jpg kép Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
157
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);
2005.11.28.
Megvalósítás:
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
159
Már csak a stílusokat és a szövegrészeket össze kell párosítanunk, és a textPane dokumentumához hozzáadnunk.
Késztette: Csöndes Emese
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.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
158
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"));
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
160
10. Alkalmazások közötti adatcsere
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!"); } Alkalmazásfejlesztési technológia 2005.11.28.
161
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
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
162
27
Adatátvitel támogatása Komponens
Drag Copy*
Drag Move*
Drop
Cut
Copy
Paste
JColorChooser**
9
⎯
9
⎯
⎯
⎯
JEditorPane
9
9
9
9
9
9
JFileChooser***
9
⎯
⎯
⎯
9
⎯
JFormattedTextField
9
9
9
9
9
9
LJist
9
⎯
⎯
⎯
9
⎯
JPasswordField
⎯
⎯
9
⎯
⎯
9
JTable
9
⎯
⎯
⎯
9
⎯
JTextArea
9
9
9
9
9
9
JTextField
9
9
9
9
9
9
JTextPane
9
9
9
9
9
9
JTree
9
⎯
⎯
⎯
9
⎯
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
163
* 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.
2005.11.28.
Alkalmazásfejlesztési technológia 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.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
165
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.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
166
Komponenstől független szöveg átvitele
Egyéb tulajdonság átvitele component.setTransferHandler(
new TransferHandler("text"));
A bemenetként átadott objektum a következő formátumú:
A komponens actionCommand tulajdonságának megadjuk a kívánt szöveget, és ezt a tulajdonságot jelöljük ki az átvitelhez.
public TransferHandler(String property)
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
167
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
168
28
Mozgathatóság feltétele
Reprezentációs osztály
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:
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
169
Vágólap
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é.
2005.11.28.
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
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
170
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()
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
171
void btCut_actionPerformed(ActionEvent e) { ta.cut(); } void btCopy_actionPerformed(ActionEvent e) { ta.copy(); } void btPaste_actionPerformed(ActionEvent e) { ta.paste(); }
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
172
Vágólap műveletek
173
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.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
174
29
public DataFlavor[ ] getTransferDataFlavors()
Transferable interfész
public DataFlavor[ ] getTransferDataFlavors()
public boolean isDataFlavorSupported( DataFlavor flavor)
public Object getTransferData( DataFlavor flavor)
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
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
175
public boolean isDataFlavorSupported( DataFlavor flavor)
2005.11.28.
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.
System.out.println(adat.isDataFlavorSupported( DataFlavor.stringFlavor));
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
177
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()); 2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
176
public Object getTransferData( DataFlavor flavor)
Megadja, hogy a vágólapról lekérdezett adatra alkalmazható-e az adott DataFlavor vagy nem. pl:
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
178
11. Java babok
179
Tulajdonságai Kódolási konvenciók Kapcsolt és kényszerített tulajdonságok Betekintés
2005.11.28.
Alkalmazásfejlesztési technológia 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).
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
181
Java bab
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
183
felhasználó felület elem,
adathozzáférési komponens és egyéb.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
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.
2005.11.28.
menükomponens,
2005.11.28.
182
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
184
Az ilyen formán előállított komponensek lehetnek
A Java bab lehet
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
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.
2005.11.28.
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.
185
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.
2005.11.28.
Alkalmazásfejlesztési technológia 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();
egyéb érték lekérdezése:
public get();
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
187
módosítás: public void set ( pt); tömb egy elemére: public get( int index); public void set (int index, e); egész tömbre: public [] get(); public void set (
2005.11.28.
Alkalmazásfejlesztési technológia 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);
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
189
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).
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
190
Betekintés EsemOsztály
Figyelő interfész Property- PropertyChangeChangeEvent Listener Property- VetoableChangeChangeEvent Listener
Felfűző metódus
Lekezelő metódus addProperty- propertyChangeChange Listener addVetoable- vetoableChangeChange Listener
Betekintésnek nevezzük azt a folyamatot, amikor egy osztály (környezet) megvizsgál egy másik osztályt, hogy:
Ezen információkat kétféleképpen állíthatjuk elő, és tehetjük elérhetővé:
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
191
milyen tulajdonságokat, metódusokat és eseményeket támogat.
tükrözés vagy BeanInfo osztály létrehozásával.
2005.11.28.
Alkalmazásfejlesztési technológia 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.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
193
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.
2005.11.28.
Alkalmazásfejlesztési technológia 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.
2005.11.28.
Alkalmazásfejlesztési technológia Késztette: Csöndes Emese
195
33