Java felhasználói felület Text komponensek Elek Tibor
Text komponensek Fajtái: - JTextField: egysoros szöveg - JFormattedTextField: egysoros formázott szöveg - JPasswordField: egysoros szöveg echo karakterrel - JTextArea: többsoros sima szöveg - JEditorPane: többsoros formázott szöveg (TXT, HTML, RTF is) - JTextPane: többsoros formázott szöveg ( StyledDocument kezelés)
Közös ős Technikák: - dokumentum modell, dokumentum filter - caret, selection, navigation filter - highlight - actions, editor kit - inputmap
Dokumentum modell A text komponensben levő szöveg és műveletei, eseményei modellezése. A segítségével tudunk pl. reagálni a szöveg változásai eseményekre, vagy pl. átdefiniálhatjuk a dokumentum szerkezetét, műveleteit. Fajtái: - PlainDocument - DefaultStyledDocument - HTMLDocument
Dokumentum modell - PlainDocument: Nincsenek karakter jellemzők, sor strukturáltság. Használja JTextField, JPasswordField, JTextArea. Főbb műveletei: gettext(), getlength(), remove(), replace(), adddocumentlistener()
Dokumentum modell - DefaultStyledDocument: formázott, struktúrált szöveg. Dokumentum szerkezet (gyökérelem, abban szakaszok, azokban bekezdések, azokban karakterek). Szövegelemek (elements: bekezdésekben stílusok vannak (azonos attribútumú részek) - HtmlDocument: A HTML dokumentumok szerkesztésére, megjelenítésére specializált. - saját
Dokumentum filter A dokumentumnak lehet filter-je, amelynek megfelelő metódusa meghívódik minden dokumentum módosító művelet előtt. Ebben továbbíthatjuk vagy nem a műveletet. Ha egy beviteli mezőnél korlátozásokat akarunk érvényesíteni a bevitelkor, pl. max. hossz, érvénytelen karakterek, akkor használjuk.
Dokumentum filter Fajtái: - DocumentFilter: minden engedve - saját: A DocumentFilter insertstring, replace, remove felüldefiniálásával. Az insertstring, replace, remove fontosabb paraméterei: FilterByPass: segítségével elérhető a dokumentum, feltételeket tehetünk a dokumentum eddigi állapotával kapcsolatban. (pl. a dokumentum eddigi hossza, szerepel-e benne már egy bizonyos szöveg, stb.)
Dokumentum filter Az insertstring, replace, remove fontosabb paraméterei: String: a beszúrandó új szöveg. Feltételeket tehetek az új szövegre, meg is változtathatom. (pl. tiltott karakterek esetén nem szúrom be vagy megváltoztatom a beszúrandó szöveget). int offset, int length: A beszúrás (törlés) helye, mérete.
Dokumentum filter pl. felüldefiniálni a replace-et, hogy egy MAXCHAR-nál ne lehessen hosszabb a dokumentum. public void replace( ) { if (fb.getdocument().getlength() + s.length() < MAXCHAR) super.replace( ); }
Dokumentum filter Példa: FrmDokumentumPelda a) A text mezőben előforduló minden változás kiíródik a konzolra b) A text mezőbe nem írható a, A betű c) A text mezőbe beíródik egy fix elő szöveg, amely nem törölhető. (Van más megoldás is erre) d) A text mezőbe beírható szöveg hossza maximálva van. Egyenlőre csak kódból, egy MAXCHAR konstans segítségével.
Caret, Selection - Szöveg kurzor kezelés: szín, pozíció állítás, lekérdezés. - Kijelölés kezelés: kijelölés, kijelölés törlése, megváltoztatása, kijelölt szöveg megváltoztatása. - Szöveg kurzor mozgás események: reagálás a szöveg kurzor mozgatásokra. Fogalmak: caret dot, caret mark
Caret, Selection Funkciók: - JTextComponent-ből elérhető: get(set)caretcolor: szín get(set)caretposition: pozíció get(set)caret: Caret movecaretposition(): kijelölés addcaretlistener(): figyelés get(set)selectionend get(set)selectionstart: kijelölés selectall(): mind kijelölés
Caret, Selection getselectedtext(): kijelölt szöveg replaceselection(): kijelölt szöveg lecserélése get(set)selectedtextcolor: kijelölt szöveg színe get(set)selectioncolor: kijelölés színe
Caret, Selection - DefaultCaret funkciói: get(set)dot: kurzor pozíció movedot(): kijelölés getmark(): kijelölés egyik vége get(set)updatepolicy: caret módosulás a dok modosulásakor get(set)selectionvisible: kijelölés láthatósága get(set)blinkrate: kurzor villogás paint(): kurzor kirajzoló metódus
Navigation filter Szöveg kurzor mozgásának korlátozására. Fajtái: - NavigationFilter: minden engedve - saját, felüldefiniálható a setdot-ot és a movedot. Ezzel letiltható (megváltoztatható) a kurzor pozícionálás, kijelölés. Pl. bizonyos helyekre nem pozícionálhatunk, nem jelölhetünk ki.
Navigation filter Fontosabb paraméterek FilterByPass fb: elérni a Caret-t int dot: új pozíció, megvizsgálható, megváltoztatható Pl. public void setdot( ) { if (dot == 5 dot == 6) { if (fb.getcaret().getdot() < 5) dot = 7; else dot = 4;} super.setdot(fb, dot, bias); }
Caret, Selection Példa: FrmCaretSelNav a) Kódból változtatva a szöveg kurzort. b) Figyelni a szöveg kurzor változásait c) Kódból kijelölni szöveget háromféleképpen. d) Megakadályozni a szöveg kurzor bizonyos helyekre mozgását.
Highlight Kiemelt (háttérszinezéssel) részek kezelése. Interface, osztályok: Highlighter, DefaultHighlighter, LayeredHighlighter - DefaultHighlighter használat Highlighter h = txt.gethighlighter(); DefaultHighlightPainter dp = new DefaultHighlightPainter(Color.BLUE); h.addhighlight(1, 5, dp);
Actions Action objektumok a lehetséges akciókhoz. Action[] getactions() Editor kit Külön osztályba összefoglalva a lehetséges akció osztályok és akció nevek. Dokumentum típustól függően változik. DefaultEditorKit StyledEditorKit HtmlEditorKit
Actions, EditorKit használat - Akciók lekérdezése Action[] aa = txt.getactions(); - A megfelelő előkeresése (pl.) int hol; for (hol = 0; hol < aa.length; hol++) { if (aa[hol].getvalue(action.name).equals( DefaultEditorKit.deleteNextWordAction)) break; } - a GUI elemekhez rendelés this.btnvalami.setaction(aa[hol]); this.mivalami.setaction(aa[hol]);
Actions, EditorKit használat Példa: FrmActionPeldak Egy text mező, két gomb delete next word, Word End.
InputMap Gyorsbillentyűk Action objektumokhoz - Lekérdezés: InputMap im = txt.getinputmap(); Gyorsbillentyűk: KeyStroke[] ks = im.allkeys(); Akció pl.: Object a = im.get(ks[0]); - Új: KeyStroke k = KeyStroke.getKeyStroke(KeyEvent.VK_A, Event.CTRL_MASK); //ctrl-a im.put(k, DefaultEditorKit.deleteNextCharAction);
JTextField Szerep: Egysoros szöveg bevitel Fontosabb tulajdonságok: - Text - Columns - Editable - HorizontalAlignment - addactionlistener()
JPasswordField Szerep: Jelszó bevitel JTextField leszármazott Fontosabb tulajdonságok: - Text: Nem használatos!!! - EchoChar - char[] getpassword() - addactionlistener() Funkciók egy része letíltva (pl. copy)
JFormattedTextField Szerep: Egysoros formázott szöveg bevitel Működés - commit: text -> value - hogyan: a formatter segítségével, közben lehet ParseException - mikor: enter, focus elnyerésekor, elvesztésekor(*), commitedit()-re (*): FocusLostBehavior értéke COMMIT, vagy COMMIT_OR_REVERT - focus elvesztés megakadályozása az InputVerifier-rel
JFormattedTextField Fontosabb tulajdonságok: - Value : a mező tartalma (text helyett) - FormatterFactory : formatterek megadása, lásd köv. slide - FocusLostBehavior : focus elvesztésekor mi történjen (commit, revert, commit_or_revert) - addpropertychangelistener( value,) : tartalom változás figyelés - iseditvalid(): a jelenlegi text commitálható-e - commitedit(): commitálás, ParseException dobódhat - get(set)inputverifier
JFormattedTextField FormatterFactory Létezik AbstractFormatterFactory, DefaultFormatterFactory A DefaultFormatterFactory lehetővé teszi Null formátum, Edit formátum, Display formátum, Default formátum megadást. Minden formátumot Formatter-rel lehet megadni. (Minimum a Default formátumot meg kell adni.)
JFormattedTextField Formatter Szerepe a string->érték, érték->string konverziók elvégzése. (stringtovalue(), valuetostring()) Létezik AbstractFormatter, DefaultFormatter, MaskFormatter, InternationalFormatter, NumberFormatter, DateFormatter - Locale információk is megadhatók. - A formattereknek felüldefiniálható a getdocumentfilter(), getnavigationfilter() metódusa is.
JFormattedTextField Pl. JFormattedTextField f = new JFormattedTextField(); //formatter létrehozás pl. NumberFormatter nf = new NumberFormatter( new DecimalFormat("#0%")); //vagy pl. //NumberFormatter nf = new NumberFormatter( // NumberFormat.getIntegerInstance()); //factory létrehozás f.setformatterfactory( new DefaultFormatterFactory(nf));
JFormattedTextField InputVerifier Nem csak szöveg komponensek használják. A focus elvesztésének engedélyezésére vagy megakadályozására szolgál. Használata például: egész szám bevitele, de nem bármilyen értékkel. Abstract osztály, a verify metódust kell felüldefiniálni a leszármazottnak. class JegyVerifier extends InputVerifier { public boolean verify(jcomponent input) { JFormattedTextField tf = (JFormattedTextField)input; long szam = 0; try { tf.commitedit(); if (tf.getvalue()!= null) szam = (Long)tf.getValue(); } catch (ParseException e) { return false; } return szam>0 && szam<6; } }
JFormattedTextField Példa: FrmFormatted - egész számok bevitelére formázva, value változás figyeléssel, InputVerifier-rel - valós számokra formázva - valós számokra formázva Locale megadással - pénz bevitel, az edit formátum valós, a többi formátum pénznem - Saját formattert használva a NumberFormatter-t felüldefiniálva, document filter-t megadva - Saját formattert használva az AbstractFormetterből kiindulva.
JTextArea Szerep: Többsoros szöveg bevitel Fontosabb tulajdonságok: - Text - Columns, Rows - Editable - LineWrap, WrapStyleWord - append(), insert(), replacerange() - getlinecount() - getlinestartoffset(), getlineendoffset() - getlineofoffset()
JTextArea Scrollozás - JScrollPane-be rakva JScrollPane sp = new JScrollPane(); JTextArea ta = new TextArea(20, 5); sp.setviewportview(ta); - HorizontalScrollBarPolicy, VerticalScrollBarPolicy
JEditorPane, JTextPane Szerep: formázott több soros szöveg - text/plain, text/html, text/rtf kezelés - betöltés funkció: read(), setpage(url), setpage(string), JEditorPane(Url) - tartalomtól függően változó EditorKit Különbség - JTextPane a JEditorPane leszármazottja - JTextPane csak StyledDocument, StyledEditorKit, míg JEditorPane akár PlainDocument is. - JTextPane kivezetett funkciók a dokumentum kezelésére (addstyle(), inserticon(), stb.)
Gyakorlat Készítsünk egy űrlapot, amelyen van egy JTextField, amely csupa nagy betűsen jelenít meg minden beleírt szöveget. Használjuk a Key eseményeket a megoldáshoz. Legyen még egy JTextField meg egy JTextArea, amely a DocumentFilter-t használja a megoldáshoz.
Gyakorlat Készítsünk egy űrlapot, amelyen van egy JTextField, amely szövegszíne editálás közben piros. (focus események) Készítsen egy JFormattedTextField-et, amelyik pénznem formátumot használ megjelenítéskor és szám formátumot editáláskor. Készítsen egy JFormattedTextField-et, amely csak 150-től kisebb pozitív egész számok bevitelére alkalmas, legyen olyan DocumentFilter-e, hogy ne is lehessen nem számot beleírni. Legyen olyan InputVerifier, hogy ne lehessen a bill. Fokuszt átadni, ha nem megfelelő szám van benne.
Gyakorlat Készítsünk egy űrlapot, amelyen van egy JTextPane. Készítsen menüket és gombokat néhány kezelő funkcióhoz. Pl. vastagítás, aláhúzás. Használjon akciókat.