Dr. Iszály György Barna
Ember központú tervezés Cél: „ ... Az emberek a kívánt műveleteket, szolgáltatásokat, és
támogató feladatokat minimális stressz mellett maximális hatékonysággal végezhetik el".
Három alapelvre támaszkodik: kiindulás és állandó fókusz: a használó személye és
feladatai iteratív tervezés: a tervezés, megvalósítás, tesztelés, és módosítás ismételt alkalmazásával; A kezelőfelület minőségét a szoftver-használat kísérleti vizsgálatával (mérésével) ellenőrizhetjük.
Ismerd meg a szakterület fogalmait, szóhasználatát! Végfelhasználói interjúk Felhasználók munkájának megismerése,
figyelemmel kisérése
Hasznosság – a termék problémamegoldó képességére utal (több funkció, nagyobb hasznosság) Használhatóság – a különböző feladatokat mennyire egyszerű elvégezni a termékkel Tetszetőség – ha tetszik a termék, akkor szívesebben használjuk
Feltárás – a különleges szükségletek felkutatása, megtalálása, és a termék tulajdonságainak módosítása a felmerült igények tükrében. Tanulás – az a folyamat, amikor a felhasználó kitalálja, hogy hogyan használja a felfedezett funkciót ahhoz, hogy teljesíteni tudja a feladatát. Hatékonyság – a felhasználó már hatékonyan tudja kezelni a funkciót további tanulás nélkül. Meghatározza, hogy egy gyakorlott felhasználó mennyi idő alatt tudja végrehajtani azokat a lépéseket, amik a funkció használatához szükségesek.
Könnyebb használhatóság Jobb produktivitás Nagyobb bevétel a cégnek
A felhasználói felület az elsődleges kapcsolódási pont a felhasználó és a számítógép között. A jól áttekinthető, gondos felhasználói felület kidolgozása fontos! A teljes szoftvertervezési folyamat része kell legyen
nagy hangsúlyt kell kapjon a megfelelő színvonalú kidolgozás elengedhetetlen
Nem (csak) esztétikai kérdés! Meglehetősen szubjektív
Tervezési elvek: Jól bevált ..taktikák' Segítenek a jobb eredmény érérésében
Ma már egy felhasználói felületnek számos megjelenítési formája lehet:
egyszerű ablakos vastagkliens alkalmazás, web-es rendszerek, Mobiltelefonok Pixelgrafikus alkalmazások (OpenGL, DirectX)
Mindegyik külön tervezést igényel! alkalmazkodni kell az eszközökhöz és környezethez figyelembe kell venni a szoftvert használó emberek
fizikai és mentális képességeit.
1.
Kiindulópont az emberi képességek Felhasználói jártasság Olyan kifejezéseket és fogalmakat kell használnia,
amelyek megfelelnek a rendszert legtöbbet használó emberek tapasztalatainak. Nem szabad egy felületet csak azért ráerőltetni a felhasználóra, mert az kényelmesen implementálható. 2.
Konzisztencia:
a felületnek a hasonló műveleteket hasonló módon kell
realizálnia.
▪ a rendszer parancsainak és menüinek ugyanazzal a formátummal kell rendelkezniük, ▪ a paramétereket minden parancshoz ugyanúgy kell átadni, és hasonlónak kell lennie a parancsok formájának.
3.
Minimális meglepetés: a rendszer soha ne okozzon meglepetést a felhasználóknak ingerültté válnak, ha nem a várt módon viselkedik. Oka: a felhasználók felépítik magukban a rendszer működésének gondolati
modelljét,
▪ Az eltérő logikai részek gondot okoznak
4.
Visszaállíthatóság: a felületnek rendelkeznie kell olyan mechanizmusokkal, amelyek
lehetővé teszik a hiba után történő visszaállítást. A. Az ártalmas tevékenységek megerősítése: ha a felhasználók ártalmas tevékenységet hajtanak végre, megerősítést kell tőlük kérni. B. Visszavonási lehetőség biztosítása: a visszavonás a rendszert visszaállítja a tevékenység bekövetkezése előtti állapotba. C. Ellenőrző pontok készítése: célszerű a rendszer állapotát bizonyos időközönként elmenteni.
5.
Felhasználói útmutatás: hiba esetén értelmes visszacsatolás a
felhasználónak Beépített súgó rendszer 6.
Felhasználói sokféleség: Különböző felhasználóknak különböző interakciós
lehetőségek biztosítása ▪ A rendszernek lehetnek alkalmi és rendszeres felhasználói, ▪ A regisztrált tagoknak többletfunkciók biztosítása
Folyamat során a felhasználók együttműködnek a tervezőkkel, prototípusokat készítenek a rendszer felületéről ▪ Design tervek, skicc rajzok, stb.
Döntés: Milyenek legyenek a felhasználói felületek jellemzői, Milyen legyen a felépítése Hogy nézzen ki
Célszerű a felületek tervezését iteratív úton fejleszteni A prototípus külön is elkészíthető párhuzamosan más szoftvertervezési tevékenységekkel ez gyorsítja a rendszer kifejlesztését
Felhasználói tevékenységek elemzése
Tervezési prototípus
Papíralapú tervezési prototípus készítése
Dinamikus tervezési prototípus előállítása
Futtatható prototípus
Terv kiértékelése a végfelhasználókkal
Terv kiértékelése a végfelhasználókkal
Végleges felhasználói felület implementálása
Három alapvető szakaszt különböztetünk meg: Felhasználók elemzése: meg kell vizsgálni, hogy ▪ a felhasználók milyen feladatokat végeznek, ▪ milyen munkakörnyezetben dolgoznak, ▪ milyen egyéb rendszereket használnak, munkájuk során.
Prototípus-készítés: a felhasználói felület terve alapján
prototípust kell készíteni. Felületek értékelése: a prototípus formálisabb értékelése. ▪ A felhasználók interfészhasználat közben szerzett aktuális tapasztalatait gyűjtjük össze.
Elemezni kell azokat a felhasználói tevékenységeket, amelyeket a rendszernek támogatnia kell. Meg kell érteni a szoftver, és a felületek pontos célját.
Három alapvető technika: feladatelemzés, interjúztatás vagy kérdőívek kitöltetése, etnográfia.
A feladatelemzés és az interjúztatás az egyénre és az egyén munkájára összpontosít Az etnográfia az emberi kapcsolatokat vizsgálja
Legelterjedtebb módszer: Hierarchikus feladatelemzés (Hierarchical Task Analysis - HTA) Felhasználói kézikönyvek készítésének elősegítésére hozták létre de használható annak meghatározására is, hogy mit kell a felhasználóknak
tenniük egy bizonyos cél elérése érdekében.
A HTA elemzés alapja: a magas szintű feladatot részfeladatokra bontjuk. terveket készítünk, hogy megadjuk, hogy egy adott helyzetben mi
történhet. A felhasználó céljából kiindulva egy hierarchiát készítünk, amely leírja, hogy mit kell tennünk a cél érdekében.
Jelölésrendszere: Feladat/részfeladatjele a doboz Doboz alatti vonal azt jelöli, hogy az adott feladatot nem bontjuk
részfeladatokra.
Előnye: (a természetes nyelvi forgatókönyvekkel szemben) Rákényszerít, hogy minden feladatot átgondoljunk és
eldöntsük, hogy felbontható-e, avagy sem. A forgatókönyvek használata során könnyen kimaradhatnak fontos feladatok A forgatókönyvek hosszúvá és unalmassá válhatnak, ha sok részletet szeretnénk beleírni.
Hátránya: leginkább csak a szekvenciális folyamatokként leírható
feladatokra alkalmazható. konkurens tevékenységek leírásakor a jelölésmód kényelmetlenné válik.
Cél: a felületekkel szemben támasztott követelmények kifejezése valamilyen formában
A szöveges leírások és a diagramok nem elég jók A felhasználói felületek mindig dinamikus folyamatot
reprezentálnak. Nem képesek kifejezni és leírni a folyamatot teljes egészében.
Hatékony megoldás: a végfelhasználó bevonásával végzett prototípus-készítés egyetlen hatékony módja a grafikus felhasználói felületének
tervezésének és fejlesztésének.
A prototípus-készítés célja: egy elkészült példafelület segítségével a tervezők
tapasztalatokat szerezzenek a működéssel kapcsolatban.
A folyamatot két lépésben hajtjuk végre: 1.
A folyamat elején papíralapú prototípusokat készítünk, és ezeket áttekintjük a végfelhasználókkal. ▪ a képernyőtervek, parancssori interfészeket
2.
Finomítjuk a tervet: egyre kifinomultabb automatizált prototípusokat fejlesztünk ▪ Elkészítjük a számítógépes reprezentációját (Rajzolás, concept art) ▪ Tesztelésre és a tevékenységek szimulálása érdekében odaadunk a felhasználóknak.
A papír alapú prototípusok előnyei:
Olcsó és hatékony Nem kell futtatható programot készíteni A terveket sem kell profi módon megrajzolni Csak azon képernyőket kell papírra lerajzolni, amelyeken kapcsolatba lépünk a rendszerrel
A kezdeti tapasztalatok után a felület tervének szoftveres prototípusát kell implementálnunk.
Három implementációs lehetőség adódik 1. Szkriptvezérelt megközelítés:
vizuális elemeket (gombokat, menüket stb.)
tartalmazó képernyőket hozunk létre valamilyen szerkesztő eszköz segítségével Ezekhez szkripteket társítunk. A felhasználói interakció során a szkript végrehajtásra kerül, például megjelenik a következő képernyő
2.
Vizuális programozási nyelvek: Egy vizuális programozási nyelv segítségével gyorsan
létrehozhatunk felületeket, A felület objektumaihoz komponenseket és szkripteket társíthatunk. 3.
Internetalapú prototípus-készítés: Ezek a megoldások egy web böngészőn és egy nyelven
alapulnak. A funkcionalitást ekkor a nyelv nyújtja (pl.: Java). Ezek a kódrészletek az oldal böngészőbe töltésekor automatikusan végrehajtódnak
Értékelés célja: megvizsgáljuk, hogy mennyire használható az adott felület, ellenőrizzük, hogy megfelel-e a felhasználói követelményeknek.
Az ellenőrzési folyamat ugyanolyan fontos, mint a tervezés, vagy a prototípus készítése!
Szubjektív, de vannak alapvető kiértékelési jellemzők:
Tanulhatósáq: mennyi idő szükséges a rendszer megtanulásához Műveleti sebesség: a rendszer válaszideje megfelelő-e. Robusztusság: milyen a rendszer hiba tűrőképessége. Visszaállíthatóság: hibák esetén milyen lehetőségek vannak a visszaállításra Adaptálhatóság: mennyire kötött a rendszer modellje.
A kiértékelést segítő eszközök Kérdőívek: arról gyűjtenek információt, hogy a
felhasználók mit gondolnak a felületről. ▪ Főleg speciális kérdések. PL: értékelje 1 -5-ig
Megfigyelés: a rendszer felhasználóinak munka közben
történő megfigyelése. Videó felvétel: a jellegzetes rendszerhasználat videó „pillanatfelvételei". Naplózás: olyan kódrészlet beépítése a szoftverbe, amely a legtöbbször használt lehetőségekről és a leggyakoribb hibákról gyűjt információt, ▪ Ez a leghatékonyabb módszer
Az objektumok egymással és a felhasználóval eseményeken keresztül tartják a kapcsolatot. Az egyik objektum kivált egy eseményt Létrehoz egy esemény objektumot
A futtató rendszer elkapja az eseményt és
eljuttatja a célobjektumhoz. A célobjektum lekezeli az eseményt
A GUI eseményvezérelt, azaz a programot a futás közben keletkezett események vezérlik Esemény: egy objektum, amely mindig egy forrásobjektumhoz kötődik Eseménydelegációs modell: segítségével az esemény eljut a megfelelő figyelő objektumokhoz, amelyek feldolgozzák az eseményt Vannak alacsony szintű illetve magas szintű események
Az esemény: Az egérrel rákattintunk egy gombra, ami átállítja az
ablak háttérszínét.
A háttérben lezajló események Az operációs rendszer (pl. a Windows) érzékeli az egér
kattintást. Az eseményt továbbítja annak a programnak, amelyik ablakában volt az egér a kattintáskor. A program továbbítja annak az objektumnak, amelyik területén történt a kattintás. Példánkban a gomb lekezeli az eseményt, azaz lefut a hozzárendelt metódus, átállítja az ablak háttérszínét.
Esemény: az alkalmazás által létrehozott objektum, mely a vele összefüggő információkat tartalmazza Esemény útja
operációs rendszer eseménysora alkalmazás forrásobjektum esemény figyelői
A komponensen a felhasználó csak akkor válthat ki eseményt, ha a komponens eleme az alkalmazás komponenshierarchiájának látható
A Java kétféle osztálygyűjteményt biztosít. Cél a platformfüggetlenség:
AWT (Abstract Window Toolkit): Felhasználja az adott operációs rendszer saját GUI
komponenseit (java.awt csomag)
Swing: Az AWT komponensek pehelysúlyú (swing) változatai A komponensek grafikusan vannak kirajzolva Az AWT-re épül (javax.swing csomag)
Téglalap alapú képernyőfelületek, meghatározott tulajdonságokkal és viselkedéssel Swing komponensek közös őse a javax.swing.JComponent Konténer komponensek Vezérlő komponensek
Konténer és komponense: A konténer komponensei fizikailag sosem
kerülhetnek a konténeren kívülre Konténer megszűnése maga után vonja az összes komponensének a megszűnését Pl.: a keret, dialógusablak, panel konténerek
Ablak és ablaka: A gyerek ablakok elhelyezkedése és mérete
független a szülő ablaktól Példa: JWindow, JDialog
Point osztály: megjegyzi egy pont x és y koordinátáit Dimension osztály: megjegyzi egy téglalap méretét (szélességét és magasságát) Rectangle osztály: megjegyzi egy téglalap helyzetét (location): bal felső sarkának x és y koordinátáit, és méretét (dimension): szélességét (width) és magasságát (height)
Alapvető, környezetfüggő metódust tartalmaz, amelyek a képernyőkezeléshez, nyomtatáshoz szükségesek Metódusok:
Static Toolkit get DefaultToolkit() Dimension getScreenSize() Int getScreenResolution() Image createImage(String filename) void beep()
Adott tulajdonságú fontot (betűfajtát) tárol Tulajdonságok String fontName (név, pl.: Arial, Monospaced) int style (stílus, pl.: PLAIN, BOLD, ITALIC)
int size (betűméret pontokban)
Példánya változtathatatlan Minden komponensnek van fontja Logikai fontnevek: SansSerif, Serif, Monospaced, Dialog, DialogInput
RGB színt tárol Minden szín a 3 alapszín (piros,zöld,kék) keveréke Tulajdonságok int red (piros összetevő, 0..255) int green (zöld összetevő, 0..255) int blue (kék összetevő, 0..255)
Példánya változtathatatlan Minden komponensnek van egy háttérszíne és egy előtérszíne (betűszíne) Konstans szín objektumokat definiál: Color.black, Color.blue, Color.white, ...
Absztrakt osztály A képernyőn megjelenő Swing komponensek közös őse Mezők
static final float
CENTER_ALIGNMENT, ...
Jellemzők
Color background Color foreground boolean opaque Font font
Cursor cursor Border border Dimension maximumSize Dimension minimumSize Dimension preferredSize float alignmentX float alignmentY String toolTipText boolean visible boolean enabled boolean requestFocusEnabled
Helyzetet és méretet metódusok
int getX() int getY() int getWidth() int getHeight() Rectangle getBounds() Point getLocation() Point getLocationOnScreen() void setBounds(int x, int y, int width, int height) void setLocation(int x, int y) void setSize(int width, int height) boolean contains(int x, int y) boolean contains(Point p)
Láthatóság, érvényesség boolean isDisplayable() void validate()
Fókusz, eseményfogadás
boolean hasFocus() void requestFocus() void transferFocus()
Szülő, állapot
Container getParent() String toString() void list()
Konténer-komponensek közös őse Jellemzők: LayoutManager layoutMgr Komponens hozzáadása, kivétele
Component add(Component comp) Component add(Component comp, int index) void remove(Component comp) void remove(int index) void removeAll()
Gyerekkomponensek
int getComponentCount() Component[] getComponents() Component getComponent(int n) Component getComponentAt(int x, int y) Component getComponentAt(Point p) boolean isAncestorOf(Component comp)
Elrendezés
Dimension getMaximumSize() Dimension getMinimumSize() Dimension getPreferredSize()
Összes AWT és Swing ablak komponens közös őse Utódai: Frame, JFrame, Dialog, JDialog, Jwindow Metódusok:
void pack() void show() boolean isShowing() void hide() void setLocationRelativeTo(Component c) void toBack() void toFront() void dispose() – törli a memóriából is
Metódusok:
void addWindowListener(WindowListener l) void removeWindowListener(WindowListener l) Component getFocusOwner() Window getOwner() Window[] getOwnedWindows()
Aktív ablak Az operációs rendszerben pontosan egy alkalmazás
aktív, egy alkalmazásban pedig pontosan egy ablak aktív.
Közvetlen ős: java.awt.Frame A Swing egyetlen natív komponense Keret: legfelső szintű ablak, nincs tulajdonosa Van szegélye, ikonja, címe és menüsora Komponenseit a tartalompanelbe (content pane) kell tenni
Jellemzők
String title Image iconImage MenuBar menuBar boolean resizable int state
Metódusok Container getContentPane() setDefaultCloseOperation(int operation) static Frame[] getFrames()
Minden konténernek van elrendezés-menedzsere Automatikusan elrendezi a konténer komponenseit, azok helyzetét és méretét Az alapértelmezett elrendezés-menedzser lecserélhető
Előredefiniált osztályt választunk Egyéni rendezőt írunk Nem használunk elrendezés-menedzsert
Az ablak pack utasítására automatikusan elrendezi a konténer komponenseit, azok helyzetét és méretét, figyelembe véve a gyerekkomponensek előnyös méreteit (a direkt módon megadott méreteket felülbírálja)
Előredefiniált elrendezés-menedzserek: FlowLayout, GridLayout, BorderLayout, CardLayout, GridBagLayout A Container osztály definiál egy elrendezésmenedzsert (LayoutManager) A konténerbe került komponensek a menedzser felügyelete alá kerülnek A menedzser felülbírálható a setLayout(…) üzenettel vagy meg is szüntethető setLayout(null)
A LayoutManager interfész Minden elrendezés-menedzsernek implementálnia kell a
LayoutManager interfészt
Container osztály idetartozó metódusai
Component add(Component comp) Component add(Component comp, int index) void add(Component comp, Object constraints) void add(Component comp, Object constraints, int index) LayoutManager getLayout() void setLayout(LayoutManager mgr) void validate()
Sorfolytonos elhelyezés balról jobbra Elemek mérete: előnyös méret (preferredSize) alapján, az ablak átméretezésekor nem változik Sorok igazítása(align): balra, jobbra, középre Komponensek közötti konstans távolság vízszintesen(hgap) és függőlegesen(vgap) JPanel és Applet alapértelmezett elrendezés-menedzsere
Megadott sor és oszlopszámú rácson való elhelyezés Rács cellái: egyenlő méretű téglalapok, minden komponens egy téglalapot foglal el (nincs lyuk!) Elemek mérete: cellaméret, az ablak átméretezésekor változik Komponensek közötti konstans távolság vízszintesen(hgap) és függőlegesen(vgap)
4+1 égtájon való elhelyezés: North (Észak), South (Dél), West (Nyugat), East (Kelet), Center (Közép) Azonos égtájon levő elemek takarják egymást Elemek mérete az ablak átméretezésekor változik Komponensek közötti konstans távolság vízszintesen(hgap) és függőlegesen(vgap) Window és leszármazottainak (JFrame, JDialog), JFrame tartalompaneljének elrendezés-menedzsere
Konténer, mely összefogja a benne levő elemeket Láthatatlan, vagy látható (szín, keret) Alapértelmezésben dupla pufferelésű Saját elrendezés-menedzsere van, alapértelmezésben FlowLayout
Minden eseményosztály közös őse a java.util.EventObject A Swing az AWT eseménymodellt használja Az AWT események a java.awt.event csomagban találhatók, míg a Swing események a javax.swing.event csomagban Az AWT események közös őse a java.awt.AWTEvent absztrakt osztály
EventObject osztály protected Object source Object getSource()
AWTEvent osztály
protected int id (Pl.: MOUSE_CLICKED) protected boolean consumed static final int RESERVED_ID_MAX static final long FOCUS_EVENT_MASK static final long KEY_EVENT_MASK int getID() protected void consume() protected boolean isConsumed()
Operációs rendszer szintjén történő elemi esemény Forrása csak komponens lehet ComponentEvent utódja Alacsony szintű AWT események:
ComponentEvent: Komponensesemény ContainerEvent: Konténeresemény FocusEvent: Fókuszesemény WindowEvent: Ablakesemény KeyEvent: Billentyűzetesemény MouseEvent: Egéresemény
Minden esemény, ami nem alacsony szintű Általában logikai esemény Forrása nem feltétlenül komponens Magas szintű események:
ActionEvent: Akcióesemény AdjustmentEvent: Igazítási esemény ListSelectionEvent: Listakiválasztás-esemény DocumentEvent: Dokumentumesemény …
SwingConstants interfész elemei Mindegyik konstans int típusú Igazítások: TOP, BOTTOM, LEFT, RIGHT, CENTER, LEADING, TRAILING Állás: VERTICAL, HORIZONTAL Irány: NORTH, SOUTH, EAST, WEST
Információ (szöveg / ikon) kiírására használatos Magas szintű esemény nem keletkezik rajta Nem kerülhet billentyűzetfókuszba Jellemzők
String text Icon icon int horizontalAlignment int verticalAlignment int horizontalTextPosition int verticalTextPosition
Gombszerű komponensek absztrakt őse: AbstractButton +--JButton +--JToggleButton | +--JCheckBox | +--JRadioButton +--JMenuItem A gombok a ButtonGroup segítségével csoportba foglalhatók
Események ActionEvent
Jellemzők
String text Icon icon int mnemonic boolean selected String actionCommand
Metódusok void doClick()
Események (örökölt) ActionEvent
Jellemzők
String text Icon icon int mnemonic boolean selected String actionCommand
Metódusok (örökölt) void doClick()
Kétállapotú gomb logikai igaz/hamis állapot jelölésére Egymástól független jelölésekre használjuk Események (örökölt) ActionEvent
Jellemzők (örökölt)
String text Icon icon int mnemonic boolean selected String actionCommand
Kétállapotú gomb logikai igaz/hamis állapot jelölésére Egymástól függő jelölésekre használjuk Csoportosítani kell (ButtonGroup segítségével) Események (örökölt)
ActionEvent
Jellemzők (örökölt) Mint a jelölőmezőnél
Metódusok void doClick()
Logikai csoportosítás A csoport gombjai közül egyszerre egy jelölhető be Csoport elemei: rádiógombok, AbstractButton utódok A ButtonGroup objektum összefogja a gombokat, felügyeli azok ki-be kapcsolását Nem komponens, nem keletkezik rajta esemény Konstruktor, metódusok ButtonGroup() void add(AbstractButton b) int getButtonCount()
Szerkeszthető szövegmező és legördülő lista kombinációja Események ActionEvent ItemEvent
Jellemzők
boolean editable int maximumRowCount boolean popupVisible Object selectedItem int selectedIndex
Konstruktorok
JComboBox() JComboBox(Object[] items) JComboBox(Vector items)
Metódusok void addItem(Object anObject)
void insertItemAt(Object anObject, int index) void removeItem(Object anObject)
void removeItemAt(int anIndex) void removeAllItems()
Szövegkomponensek absztrakt őse: JTextComponent +--JTextField | +--JPasswordField +--JtextArea Adatmodellje: Document Esemény
DocumentEvent (adatmodellen)
Jellemzők
Document doc String text Caret caret int caretPosition Color caretColor boolean editable int selectionStart int selectionEnd Color selectionColor Color selectedTextColor
Beviteli mező Események ActionEvent DocumentEvent (adatmodellen, örökölt)
Jellemzők örökölt: doc, text, caret, caretPosition, caretColor,
editable, selectionStart, selectionEnd, selectionColor, selectedTextColor int columns int horizontalAlignment
Többsoros beviteli mező Nincs görgetősávja; görgetés: JTextArea ta = new JTextArea(); cp.add(new JScrollPane(ta));
Esemény
DocumentEvent (adatmodellen, örökölt)
Jellemzők
örökölt: doc, text, caret, caretPosition, caretColor, editable,
selectionStart, selectionEnd, selectionColor, selectedTextColor int columns int rows int tabSize boolean lineWrap
Metódusok
void insert(String str, int pos) void append(String str) void replaceRange(String str, int start, int end) int getLineCount() int getLineStartOffset(int line) int getLineEndOffset(int line) int getLineOfOffset(int offset)
AbstractDocument osztály metódusai String getText(int offset, int length) int getLength()
Választható szövegek listája Nem gördül le, fix területen helyezkedik el Egyszerre több eleme is kiválasztható Adatmodellje: ListModel Kiválasztásmodellje: ListSelectionModel Esemény ListSelectionEvent (kiválasztásmodellen)
Példa:
JList lista=new JList(); lista.getModel().addElement("Hosszúhetény"); DefaultListModel model = new DefaultListModel(); JList lista=new JList(model); model.addElement("Hosszúhetény");
Jellemzők ListModel model (alapért.:DefaultListModel) int selectionMode ▪ ListSelectionModel.SINGLE_SELECTION, ▪ ListSelectionModel.SINGLE_INTERVAL_SELECTION, ▪ ListSelectionModel.MULTIPLE_INTERVAL_SELECTION
int selectedIndex int visibleRowCount int fixedCellWidth int fixedCellHeight
Metódusok
void setListData(Object[] listData) void setListData(Vector listData) void setSelectedValue(Object anObject, boolean shouldScroll) Object getSelectedValue() Object[] getSelectedValues() void setSelectedIndex(int index) int getSelectedIndex() void setSelectedIndices(int[] indices) int[] getSelectedIndices() boolean isSelectedIndex(int index) boolean isSelectionEmpty() void clearSelection() int getFirstVisibleIndex() int getLastVisibleIndex()
DefaultListModel osztály Vectorhoz hasonló
Program funkcióinak csoportosítása Menühierarchia: tetején: menüsor (JMenuBar) menüsor elemei: lebomló menük (JMenu) menü lehetséges elemei: ▪ újabb menü (JMenu) ▪ menütétel (JMenuItem) ▪ jelölő-menütétel (JCheckBoxMenuItem) ▪ rádió-menütétel (JRadioButtonMenuItem) ▪ menüelválasztó (szeparátor)
Menüsor (főmenü) a keret tulajdona kerethez rendelés: setJMenuBar(JMenuBar mb)
Menütételek Gombok tovább nem bonthatók
Gyorsabb elérés emlékeztető karakter (menü, menütétel) gyorsbillentyű (menütétel)
Menüosztályok hierarchiája JComponent +--JMenuBar +--AbstractButton | +--JMenuItem | | +--JCheckBoxMenuItem | | +--JRadioButtonMenuItem | | +--Jmenu Esemény:
ActionEvent minden gombon keletkezik menütételeken kell lekezelni
JMenuBar osztály JMenuBar() JMenu add(JMenu m)
JMenu osztály
JMenu(String text) JMenu() JMenuItem add(JMenuItem mi) void addSeparator() void insertSeparator(int index)
JMenuItem(String text, Icon icon) JMenuItem(String text, int mnemonic) örökölt jellemzők: text, icon, mnemonic, selected, actionCommand boolean enabled Keystroke accelerator void doClick()
Tipikusan felhasználói adatbevitelre, nyugtázásra, információközlésre szokás használni Tulajdonosa: keret vagy másik dialógusablak Lehet modális – nem lehet átkapcsolni róla Tartalompanel Gyerekeit a tartalompanelbe kell tenni: dialog.getContentPane().add(gyerek);
elrendezés-menedzsere alapértelmezésben BorderLayout Esemény WindowEvent
Jellemzők String title boolean modal boolean resizable
Konstruktorok, metódusok
JDialog(Frame owner, String title, boolean modal) JDialog(Dialog owner, String title, boolean modal) … void show() void hide()
Az opciópanel statikus metódusai szabványos dialógusokat jelenítenek meg modálisan: Információközlés (showMessageDialog) Megerősítés kérése (showConfirmDialog) Adatkérés (showInputDialog)
Dialógusablak összeállítása
Dialógus típusa: Message, Confirm, Input, Option Ikon (messageType) megadása Üzenet (message) megadása Opciók kiválasztása
Dialóguskészítő metódusok paraméterei
Component parent Object message String title int messageType Icon icon int optionType Object[] selectionValues Object initialSelectionValue Object[] options Object initialValue
Dialóguskészítő metódusok static void showMessageDialog(paraméterek)
Paraméterek: parent, message, title, messageType, icon static int showConfirmDialog(paraméterek) Paraméterek: parent, message, title, optionType, messageType, icon static String showInputDialog(paraméterek) Paraméterek: parent, message, title, messageType, icon, selectionValues, initialSelectionValue static int showOptionDialog(paraméterek) Paraméterek: parent, message, title, optionType, messageType, icon, options, initialValue
Adott időközönként (delay) egy ActionEvent eseményt bocsát ki és elküldi az őt hallgató objektumoknak Leállítható (stop) és újraindítható (start) Van egy kezdeti késleltetése A periódusos és a kezdeti késleltetés menet közben is állítható Egy időzítőhöz akárhány hallgató kapcsolható, és egy hallgató több időzítőt is hallgathat Esemény: ActionEvent
Jellemzők int delay int initialDelay
Konstruktor, metódusok
Timer(int delay, ActionListener listener) void addActionListener(ActionListener listener) void remove ActionListener(ActionListener listener) void start() void stop() void restart() boolean isRunning()
Javában csak a grafikus felületre lehet rajzolni Minden komponenshez tartozik egy Graphics osztályú objektum java.awt.Graphics: absztrakt osztály, amely tartalmazza a grafikus műveletekhez szükséges deklarációkat Egy komponens grafikus objektumát a rendszer hozza létre Kétféle rajzolási lehetőség van:
Lekérjük a grafikus felületet (getGraphics()) ▪ Újrarajzoláskor a rajz nem jelenik meg
Felülírjuk a paintComponent(Graphics gr) metódusát ▪ A paintComponent() metódust a rendszer automatikusan meghívja minden olyan esetben, amikor a felületet frissíteni kell (pld. elmozgatás, átméretezés)
Graphics getGraphics(): visszaadja a komponens grafikus felületét protected void paintComponent(Graphics gr): itt adjuk meg a rajzoló utasításokat void repaint(): újrarajzolja a komponenst. Akkor használjuk, ha az újrarajzolás szükségességét az operációs rendszer nem veheti észre
Egy Graphics objektum állapota: Komponens, amire rajzolunk
Rajzolószín, betű Kivágási terület
Eltolási pont Rajzolási mód: ▪ Felülíró ▪ XOR
setColor(Color c), getColor() setFont(Font f), getFont() setClip(…), getClipBounds() translate(x, y) setPaintMode(): felülíró rajzolás setXORMode(Color c): ha egy alakzatot kétszer kirajzolunk, visszakapjuk az eredeti alakzatot drawLine(), drawString() drawRect(), fillRect(), clearRect() drawOval(), fillOval(), drawArc(), fillArc()
File osztály Bejegyzést reprezentál A bejegyzést útvonalával azonosítja
Mezők
static String separator static char separatorChar static String pathSeparator static char pathSeparatorChar
Konstruktorok
File(String pathname) File(String parent, String child) File(File parent, String child)
Metódusok
boolean isAbsolute() String getAbsolutePath() File getAbsoluteFile() String getPath() String getCanonicalPath() throws IOException File getCanonicalFile() throws IOException String getParent() File getParentFile() String getName()
Metódusok
boolean isDirectory() boolean isFile() long length() long lastModified() boolean setLastModified(long time) boolean canRead() boolean canWrite() boolean exists() boolean isHidden() boolean setReadOnly()
Metódusok boolean mkdir() boolean mkdirs() boolean createNewFile() throws IOException boolean delete() void deleteOnExit()
boolean renameTo(File dest) String[] list() String[] list(FilenameFilter filter) File[] listFiles() File[] listFiles(FilenameFilter filter) static File[] listRoots()
Könyvtárbejegyzések szűrését szolgálja
Metódus boolean accept(File dir, String name) Azon állományok esetén tér igazzal vissza,
melyekre teljesül a feltételünk
Pl.: public boolean accept(File dir, String name) { return name.toUpperCase().endsWith(„.txt”); }
Stream - olyan objektum, amely egy célhelyre adatokat képes sorosan írni, ill. egy forráshelyről sorosan olvasni Folyamok osztályzása (feldolgozott elemek típusa szerint)
Bájtfolyam (byte stream) Karakterfolyam (character stream) Adatfolyam (data stream) Objektumfolyam (object stream)
Folyamok osztályzása (adatfeldolgozás iránya szerint) Beviteli folyam (input stream) Kiviteli folyam (output stream)
Írás/olvasás egysége: bájt (0..255)
Minden adatsorozat feldolgozható bájtfolyamként
Absztrakt ősei: InputStream, OutputStream
Állományból olvasó bájtfolyam:
FileInputStream
Állományba író bájtfolyam: FileOutputStream
Összes beviteli bájtfolyam absztrakt őse
Metódusok abstract int read() throws IOException int read(byte[] b) throws IOException int read(byte[] b, int off, int len) throws IOException int available() throws IOException long skip(long n) throws IOException void close() throws IOException
Összes kiviteli bájtfolyam absztrakt őse
Metódusok abstract void write(int b) throws IOException void write(byte[] b) throws IOException
void write(byte[] b, int off, int len) throws IOException void flush() throws IOException
void close() throws IOException
Írás/olvasás egysége: unikód karakter (2 bájt) Szöveges állományok feldolgozására szokás használni Absztrakt ősei: Reader, Writer Pl.: FileReader, FileWriter
Összes beviteli karakterfolyam absztrakt őse
Metódusok int read() throws IOException int read(char[] cbuf) throws IOException abstract int read(char[] cbuf,int off, int len) throws
IOException boolean ready() throws IOException long skip(long n) throws IOException abstract void close() throws IOException
Összes kiviteli karakterfolyam absztrakt őse
Metódusok void write(int c) throws IOException void write(char[] cbuf) throws IOException abstract void write(char[] cbuf, int off, int len)
throws IOException void write(String str) throws IOException void write(String str, int off, int len) throws IOException abstract void flush() throws IOException abstract void close() throws IOException
Csak olvasható karaktereket tartalmazó állomány Sorokból áll, a sorok pedig karakterekből Soros szervezésű Állományból olvasó karakterfolyam: FileReader
Állományba író karakterfolyam: FileWriter
Karakterkódolás A szöveges állomány tárolásának módja az operációs rendszer
karakterkódolási szabványától függ Lemezen tárolt karakter és a Java karakterei között kódolás/dekódolás: InputStreamReader, OutputStreamWriter
print és println metódusokat definiál Ezekkel az adatok olvasható formában kerülnek ki a karakterfolyamra PrintStream PrintWriter-hez hasonló, de elavult System.out és System.err szabványos
eszközök osztálya
Írás/olvasás egysége: primitív adat vagy String Szűrő bájtfolyam: primitív adat / String bájt konverzió Pl.: DataInputStream, DataOutputStream
DataInput, DataOutput interfészek primitív adat és String írása / olvasása primitív adat / String bájt konverzió
FilterInputStream, FilterOutputStream Szűrőfolyamok ősosztályai
DataInput interfész (bájt primitív adat / String) boolean readBoolean() throws IOException byte readByte() throws IOException … String readLine() throws IOException String readUTF() throws IOException
DataOutput interfész (primitív adat / String bájt) void write(int b) throws IOException void write(byte[] b) throws IOException void write(byte[] b, int off, int len) throws IOException void writeBoolean(boolean v) throws IOException void writeByte(int v) throws IOException … void writeBytes(String s) throws IOException void writeChars(String s) throws IOException void writeUTF(String s) throws IOException
DataInputStream
Beviteli szűrő adatfolyam Csak egy másik bájtfolyamból tud olvasni bájt primitív adat / String konverzió Konstruktor: DataInputStream(InputStream in)
DataOutputStream
Kiviteli szűrő adatfolyam Csak egy másik bájtfolyamba tud írni primitív adat / String bájt konverzió Konstruktor: DataOutputStream(OutputStream out)
Segítségével csökkenthetőek a memória és a külső erőforrás (pl. fájl) között az író/olvasó műveletek száma BufferedInputStream, BufferedOutputStream Bájtfolyamot pufferező beviteli/kiviteli szűrőfolyam Konstruktorok
BufferedInputStream(InputStream in) BufferedInputStream(InputStream in, int size) BufferedOutputStream(OutputStream out) BufferedOutputStream(OutputStream out, int size)
BufferedReader, BufferedWriter
Karakterfolyamot pufferező beviteli/kiviteli folyam Konstruktorok
BufferedReader(Reader in) BufferedReader(Reader in, int size) BufferedWriter(Writer out) BufferedWriter(Writer out, int size)
Írás/olvasás egysége:
primitív adat vagy szerializálható objektum
Szerializáció
Írás
Olvasás
Objektum bájtfolyam Előnye: objektumok perzisztensen eltárolhatók objektum bájtfolyam ObjectOutputStream
bájtfolyam objektum ObjectInputStream
Az objektum osztályának implementálnia kell a Serializable jelölő interfészt Szerializálás deklarálás sorrendjében minden objektum csak egyszer kerül tárolásra java.io.NotSerializableException keletkezhet Szerializáláskor a bájtfolyamra kerülő adatok: osztály azonosításához: osztály neve, azonosítója, … objektum adatai(kivéve static és transient adatok) Visszatöltéskor az objektum állapota ugyanaz lesz, mint kimentéskor volt Visszaolvasás ugyanolyan sorrendben, mint kiíráskor java.lang.ClassNotFoundException keletkezhet Alapértelmezett szerializáló mechanizmus
Közvetlen hozzáférésű állomány Írható és olvasható egyszerre Írás/olvasás egysége: bájt, primitív adat vagy String (tetszőleges objektum nem lehet!) Állománymutató (állománypozíció, file pointer)
Értéke: állomány elejétől számított bájtsorszám Lekérdezhető, beállítható Olvasó, író utasítások állítják
Konstruktorok RandomAccessFile(String name, String mode)
throws FileNotFoundException RandomAccessFile(File file, String mode) throws FileNotFoundException mode: "r" vagy "rw"
Metódusok
long getFilePointer() throws IOException void seek(long pos) throws IOException int skipBytes(int n) throws IOException long length() throws IOException void setLength(long newLength) throws IOException
int read() throws IOException, EOFException boolean readBoolean() throws IOException
… String readLine() throws IOException String readUTF() throws IOException void write(int b) throws IOException void writeBoolean(boolean v) throws IOException … void writeBytes(String s) throws IOException void writeChars(String s) throws IOException void writeUTF(String s) throws IOException void close() throws IOException
Java Database Connectivity Programozói interfész (API) SQL parancsokat küldhetünk az adatbázisoknak és az adatbázis válaszait (eredménytáblák, visszatérési értékek, hibakódok, tárolt eljárások output paraméterei) feldolgozhatjuk Az adatbázisok eléréséhez szükséges Java osztályok a java.sql csomagban találhatók
Adatbázisok használatához az alábbi műveletekre van szükség: Összeköttetés (connection) létesítése az
adatbázissal SQL utasítások végrehajtása (Select, Insert, Update, Delete, Call) Az adatbázis kezelő rendszer válaszainak feldolgozása (eredménytáblák, hibakódok, stb.)
A JDBC meghajtó-programok feladata a JDBC API és a konkrét adatbáziskezelő rendszer illesztése Többféle megvalósítása van: JDBC-ODBC áthidaló program + ODBC meghajtó-
program JDBC – saját API áthidaló – meghajtó-program Stb.
Letöltés: http://dev.mysql.com/downloads/connector/ Célszerűen platform független (Independent) Kicsomagolás A "mysql-connector-java-5.1.{xx}-bin.jar” fájl másolása a JAVA_HOME könyvtárba pl. c:\program files\java\jdk1.8.0_{xx}\jre\lib\ext„ Vagy bemásolni a projekt Libraries könyvtárába
A meghajtóprogram kiválasztható: Megnevezéssel
Automatikusan a DriverManager osztály
segítségével
A DriverManager osztály nyilvántartja a használható meghajtó-programokat, és az adatbázis összeköttetés létesítésekor kiválasztja a megfelelő meghajtót.
Két módszerrel lehetséges: A meghajtó-program osztályának közvetlen
betöltésével (Cass.forName() statikus metósussal) A jdbc.drivers rendszerparaméter beállításával. A DriverManager osztály inicializálásakor a jdbc.drivers rendszerparaméterben tárolt osztályok automatikusan betöltődnek
Adatbázis-URL-ek szintaxisa a következő: jdbc:alprotokoll:adatforrás ▪ a protokoll neve: jdbc ▪ az alprotokoll nevét a megfelelő meghajtó-program forgalmazója határozza meg, ezért rendszerint megegyezik a forgalmazó nevével ▪ az adatforrás leírása pedig az adatbázis eléréséhez szükséges további adatokat (pl. adatbázis neve és a hálózat címe, a felhasználó neve és jelszava) tartalmazza
Példa: jdbc:oracle:thin:@site:port:database jdbc:odbc:datasource;odbcoptions jdbc:mysql://localhost/database
Létrehozása:
Connection DriverManager.getConnection(url, username, password); Lezárása: Connection objektum close() metódusával
Statement: egyszerű utasítások végrehajtása PreparedStatement: bemenő paraméterekkel rendelkező utasítások végrehajtása CallableStatement: be/kimenő paraméterekkel rendelkező tárolt eljárások végrehajtása Az eredmény a ResultSet osztályként adódik vissza
Name – (Minden komponens) Text - Szöveg (Form, Button, TextBox) Enabled – ha hamis (false) a komponens a program futtatásakor le lesz tiltva. (Button, TextBox) Anchor - Átméretezhető ablakoknál hasznos. Beállíthatjuk, hogy a komponens mely oldalainak távolsága legyen az ablak oldalaihoz rögzítve. (Button, TextBox) TabIndex - A vezérlőnk helyét adja meg a tabulátoros elérési sorban. TabStop - Jelzi, hogy a Tab billentyűvel adhatunk-e fókuszt az elemnek. Location / x,y - A vezérlő koordinátáit adja meg az őt tartalmazó elem (pl. űrlap) bal-felső sarkától mérten. Size / Width, Height - A vezérlő szélessége és magassága pixelekben megadva.
Text - A vezérlőhöz rendelt szöveg TextAllign - A szöveg helyzetét állítja a vezérlőn belül. Font - A vezérlő szövegének betűtípusa. ForeColor - A vezérlő előtérszínét állítja. BackColor - A vezérlő háttérszínét állítja. Cursor - Az egérkurzor alakja a vezérlő felett. AutoSize - A vezérlő méretét automatikusan úgy állítja be, hogy a vezérlő szövege elférjen. UseMnemonic - Mnemonic-ok (emlékeztetők) használatának engedélyezése. Menmonic: Ha gombok vagy menüpontok feliratában „&” karaktert helyezünk el, az „&” karakter utáni betű aláhúzva jelenik meg. Az aláhúzott betű Alt billentyűvel együtt leütve kattintás eseményt vált ki. Pl: &Ok -> Ok
Click – Kattintáskor/Enter nyomásakor következik be. TextChanged - Ha a vezérlő Text tulajdonsága (szövege) megváltozik Enter - a vezérlő megkapja a fókuszt. (Kiválasztjuk egérrel vagy a Tab billentyűvel) Leave - ha a vezérlő elveszti a fókuszt. MouseClick - Egérkattintáskor következik be. MouseDown - ha a komponens fölött lenyomjuk az egérgombot. MouseUp - ha a komponens fölött felengedjük az egérgombot. MouseEnter - amikor az egér a komponens látható része fölé ér. MouseLeave - amikor az egér elhagyja a komponens látható részét. MouseMove - A komponens fölött megmozduló egér váltja ki. MouseHover - Akkor következik be, amikor az egér már eltöltött egy bizonyos időt a komponens fölött.