Swing je součást JFC Je to vylepšené GUI funkčně, esteticky i ergonomicky ( nazvaný náhodně větou: "Swing dancing is getting to be really big." - v San.

Slides:



Advertisements
Podobné prezentace
Počítačová grafika.
Advertisements

Technologie pro publikování na webu 1
(instance konkrétní třídy)
Vývoj aplikací s využitím JavaFX
Ing. Jan Mittner MySQL Workbench 2. Základy práce s databází 3. Subversion 2.
Formuláře Formuláře lze nalézt téměř na každém webu. Formuláře lze nalézt téměř na každém webu. Použití formulářů: Použití formulářů: Blog Blog Uživatelské.
CSS a HTML 5. HTML 5 HTML5 je nová verze specifikace značkovacího jazyka HTML, která přináší podstatné změny v technologiích webových stránek. HTML5 umožňuje.
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Uživatelská rozhraní Uživatelská rozhraní 9. cvičení.
PJV151 Vnořené a vnitřní členy mohou být členy tříd a interfejsů. Je-li X obalem Y a Y je obalem Z, pak Z získá jméno X$Y$Z - kompilací vzniknou classy.
Polymorfismus Dědičnost
Formáty grafických souborů
Páté cvičení Dědičnost Interface Abstarktní třídy a metody
Podmíněné vykonávání a rozvětvení. Co je to? Podmíněné vykonávání = nechceme provést všechny příkazy, chceme určité části kódu něčím podmínit Rozvětvení.
Adapter. Adapter – pojem Součástka navržená k propojení dvou „nekompatibilních“ zařízení Definice slova podle Cambridge Advanced Learner's Dictionary:
Objektové programování
BAKALÁŘSKÁ PRÁCE Tomáš Janda
Jedenácté cvičení Vlákna. Java cv112 Vlákna Operační systém Mutitasking – více úloh se v operačním programu vykonává „současně“ Java Multithreading -
Seminář C cvičení Obsluha výjimek Ing. Jan Mikulka.
ActionScript Moderní počítačové aplikace. Charakteristika Je odvozen od JavaScriptu Integruje do Flashe interaktivní ovládání Umožňuje vytvořit přehledné.
Composite [kompozit, ne kompozajt]. Composite Výslovnost  kompozit, ne kompozajt Účel  Popisuje, jak postavit hierarchii tříd složenou ze dvou druhů.
Uživatelská rozhraní Uživatelská rozhraní 6. cvičení.
CSS styly Kaskádové styly (CSS – Cascading Style Sheets) jsou prostředkem, který zajišťuje jednotný vzhled publikovaných stránek. Technologii CSS podporují.
Ing. Jan Mittner Životní cyklus požadavku 2. Moduly 3. Pluginy 4. Jak řešit komponenty typu menu 5. atd. 2.
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
OSNOVA: a) Úvod do OOPb) Třídy bez metod c) Třídy s metodamid) Konstruktory a destruktory e) Metody constf) Knihovní třídy g) Třídy ve tříděh) Přetížení.
Návrhový vzor Factory v JAVA API Martin Kot Katedra informatiky VŠB – Technická univerzita Ostrava
Návrh a tvorba WWW Přednáška 5 Úvod do jazyka PHP.
DisplayObjectContainer. Důležité vlastnosti (property) mouseChildren : Boolean Implicitně =true Určuje, zda děti mohou být „target“ pro myší MouseEvent.
OSNOVA: a) Přetížení členských funkcí b) Dědičnost tříd Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 2 pro obor EST BPC2E.
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
Copyright (C) 2000 Vema, a. s.1 V3 klient Michal Máčel Provozní integrace G2, HR/Win a internetu.
Prezentace.
Windows Presentation Foundation
Šesté cvičení Výjimky Balíky.
Bloky – tvorba a vkládání ProgeCAD. Opakování Př. Nakreslete součást dle zadání (využijte hladin – obrys, osa, kóty): 1. Okótujte součást lineární kótou,
Formuláře Formuláře uzavíráme do elementů Formuláře uzavíráme do elementů a a Tyto elementy jsou součástí jazyka XHTML, to znamená, že při použití v PHP.
PJV031 Přetypování (casting) Objekty, atributy, lokální proměnné, parametry a návratové hodnoty metod mají definovaný, neměnný typ. Jsou dva druhy typů:
Decorator. Rozšiřuje objekty o dodatečné chování  rozšiřuje konkrétní objekty, ne třídy  rozšiřuje objekt dynamicky, tj. za běhu Upřednostňuje kompozici.
:: java advanced imagingds :: 36APG - JAI david sedláček javaai/jai/index.html.
Základy HTML 1 Vložení obrázku. 2 Grafické formáty První předpoklad pro vložení obrázku do stránky je jeho uložení ve vhodném formátu. Prohlížeče podporují.
InstantAtlas dynamické webové interaktivní atlasy.
Akademie ZENU Ukázková aplikace. Tak o tomhle to nebude…
Windows Presentation Foundation Ovládací prvky. Ovládací prvky Všechny standardní prvky jsou dostupné a některé nové Třídy jsou společné pro WPF System.Windows.Controls,
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
JavaScript úvod. Jazyky webového vývojáře Dynamická stránka  aktivně mění svůj obsah v reakci na činnost uživatele  zpracování na straně serveru (PHP,
Template Method. Motivační příklad – reálný svět Čaj 1) Uvař vodu 2) Dej do hrnku sáček čaje 3) Zalij hrnek 4) Přisyp cukr a vymačkej citrón Káva 1) Uvař.
Uživatelská rozhraní Uživatelská rozhraní 10. cvičení Martin Němec A
Uživatelská rozhraní Uživatelská rozhraní 8. cvičení.
Praha & EU: Investujeme do vaší budoucnosti Evropský sociální fond Gymnázium, Praha 10, Voděradská 2 Projekt OBZORY GUI v Javě úvod.
PJV08 1 GUI (Graphical User Interface)‏ Vizuální a interaktivní komunikaci počítač-člověk podporují balíčky: java.awt - obsahuje: - komponenty: knoflíky,
PJV15 1 Vnořené ( nested ) a vnitřní ( inner ) členy Třídy či interfejsy mohou být členy tříd či interfejsů. Je-li X obalem Y a Y obalem Z, pak Z získá.
PJV26 1 JavaBeans je technologie výroby znovupoužitelných, na platformě nezávislých komponent. Podporována je od jdk 1.1 a BDK. Bean lze vizuálně vkládat.
NetBeans Plugin.  Echo2 web framework (Ajax, Java)  NetBeans IDE (modularita, Swing designer)  Vizuální design uživatelského rozhraní (WYSIWYG)  Drag.
Applety Applet ( Application program–let ) je javský program upravený ke spuštění v klientově prohlížeči ( browseru ). Prohlížeč je aplikace ( application.
Události ( Events ) GUI definuje model událostí ( event model ) – od Javy 1.1 je to tzv. delegační model. ( Původní tzv. hierarchický model se již neužívá.
Pattern Oriented Software Architecture
Instalace Javy ( pro Windows )
C# WPF.
Generické typy jsou třídy či interfejsy deklarující tzv. typové parametry jimiž: systematizují typovou kontrolu kompilátorem, vyjadřují jasněji smysl,
Java 8: Mary Had a Little Lambda
Návrhový vzor Flyweight
Bridge.
Reflexe jako introspekce
Bloky – tvorba a vkládání
C# přehled vlastností.
Vázání dat Data Binding
Layout v Xamarin.Forms Polohovací prvky
Výčtové typy ( Java 5 ) Výčtové typy jsou speciální třídy zavedené pro větší bezpečí a pohodlí. V nejjednodušší variantě se definují příkladmo takto:
Composite “Spojuj a panuj”.
Transkript prezentace:

Swing je součást JFC Je to vylepšené GUI funkčně, esteticky i ergonomicky ( nazvaný náhodně větou: "Swing dancing is getting to be really big." - v San Francisku. ). JFC ( Java Foundation Classes od v. 1.2 ) zahrnuje ještě 2D grafiku, lepší tisk, Accesibility a DnD ( Drag and Drop - ovládání gesty ). Swing nezávisí na platformě ( Windows, Motif ), umí dynamicky měnit vzhled komponent dle vkusu uživatele díky vlastnosti LookAndFeel ve stylu Windows, Motif anebo Metal. Na rozdíl od AWT využívá Swing lightweight komponenty, které vytváří Java a nikoli platforma. Swing staví komponenty na koncepci MVC ( Model – View – Control ), což usnadňuje modifikace a tvorbu dalších komponent. Pro zrychlení mnohé komponenty nejsou synchronizované. Využívá i starší třídy AWT ke konstrukci komponent – např.: Component / JComponent, Frame / JFrame, Applet / Japplet. Přidává řadu velmi důmyslných komponent – např.: JTable či JTree. PJV10

Swing API javax.accessibility javax.swing – základní balíček, ( celkem má 18 balíčků ) .border – pro tvorbu okrajů komponent, .colorchooser – výběr barev, .event – rozšíření událostí, listenerů a adapterů .filechooser – výběr souborů, .plaf ( .basic .metal .multi .nimbus .synth ) – plug, look and feel, .table – tabulková struktura, .text ( .html .html.parser .rtf ) – pro texty různých typů, .tree – stromová struktura, .undo – podpora undo / redo. Swing částečně staví na balíčcích java.awt a java.awt.event. Komponenty jsou rozmanitější, elegantnější a strukturovanější, s vyšší funkcionalitou a usnadňují tvorbu dalších uživatelských komponent. Zavedení tipů a ikon zlepšuje srozumitelnost. Ikony mohou být obrázky(.gif, .jpeg, .png či vypočítané ) a to i animované. PJV10

AWT a Swing Container Window JWindow Frame JFrame Dialog JDialog java.lang Object java.awt.image java.io AWT a Swing ImageObserver MenuContainer Serializable javax.swing java.awt Component AWT komponenty RootPane Container java.awt java.applet Container Panel Applet JApplet Window JWindow CellRenderer Pane Frame JFrame JComponent Dialog JDialog Layout=null javax.accessibilty Accessible FileDialog JInternal Frame J komponenty PJV10

JRootPane Každý kontejner implementující RootPaneContainer ( např. JFrame, JDialog, JWindow, JInternalFrame a JApplet ) má root pane. Root pane má tři další plochy (pane) a volitelně menu, které lze přidat k Frame nebo Appletu. Obvykle stačí pracovat jen s content pane, kam se vkládají komponenty. Pro rafinovanější GUI lze využít: vrstvení pomocí layered pane realizující hloubku ( tzv. Z-souřadnice ) zasklení pomocí předsazené glass pane. PJV10

Vrstvení pomocí LayeredPane Dodává hloubku a defaultně nemá LayoutManager layer= -30000 FRAME_CONTENT_LAYER ContentPane a MenuBar 0 DEFAULT_LAYER - pro obvyklé komponenty 100 PALETTE_LAYER - pro plovoucí toolbar a palety 200 MODAL_LAYER - pro dialogy 300 POPUP_LAYER - pro popups 400 DRAG_LAYER - dočasně pro přesun Pro umístění slouží přetížené metody add( Component x, Object constrain, int pos ) kde constrain nutno zadat jako typ Integer PJV10

Vrstvení public class LayerTest extends JFrame { Component x1=..., x2=..., x3=...; int layer1=..., layer2=..., layer3=...; int pos1=..., pos2=..., pos3=...; // udává hloubku -1, -2, ... public LayerTest( ) { JLayeredPane lp = new JLayeredPane( ); lp.add( x1, new Integer(layer1), pos1 ); lp.add( x2, new Integer(layer2), pos2 ); lp.add( x3, new Integer(layer3), pos3 ); this.getContentPane( ).add( lp ); this.setBounds( 100, 100, 500, 500 ); this.setVisible( true ); } .... PJV10

Zasklení pomocí glass pane Glass pane je “sklo“ oddělující uživatele od vytvořeného GUI. Sklo má rozměry root pane a zakrývá i eventuální lištu pro menu, paspartu Frame však nikoli. Zasklení omezuje uživatelovy akce, naviguje ho či demonstruje možnosti. K tomu je třeba jeho akce zachytit listenery a případně je reinterpretovat. Na sklo lze i kreslit. Vložení do JFrame či JAppletu Component y = ... ; this.setGlassPane( y ); Component gp = this.getGlassPane( ); gp.setOpaque( false ); gp.setVisible( true ); // true – zasklít, false - odsklít PJV10

javax.swing.JComponent je potomek třídy java.awt.Container a je předkem J komponent ( kromě JFrame, JDialog, JWindow, JApplet ) kterým zajišťuje: okraje ( border ) vyvětlivky ( tooltip ) vymalování ( custom painting ) – je rafinovanější L&F – v pozadí je ComponentUI dle výběru UIManageru vlastnosti požadované uživatelem podporu accessibility podporu DnD ( Drag and Drop ) - táhni a upusti double buffering – defaultně kreslí do skrytého bufru pro hladké animace key binding ( vazba na klávesy ) Většina komponent podporuje grafiku a obrázky. Samotná JComponent je vždy transparentní – ač definuje setOpaque(…), avšak opacita se realizuje až v potomcích. PJV10

JLabel a JToolTipText JLabel má mnohem významnější úlohu než java.awt.Label. Do JLabel lze vložit text i ikonu a nastavit jejich vzájemnou horizontální a vertikální polohu. Icon ic = new ImageIcon( "images/duke.gif" ); JLabel la = new JLabel( "This is Duke" , ic, SwingConstants.LEADING ); JLabel má pozadí defaultně transparentní, tj. opacity je false. To lze ovládat metodou setOpacity( boolean opacity ). JToolTipText je vysvětlivkou, kterou lze vybavit každou instanci třídy JComponent a to metodou: setToolTipText( String text ) instanci JTabbedPane pak metodou: setToolTipText( String text, int index ) PJV10

AbstractButton Koncept knoflíků a příbuzných součástek je nově strukturován. Strom třídy AbstractButton obsahuje (viz schémata): JButton, JToggleButton, JCheckBox, JRadioButton – spolupracuje s ButtonGroup, JMenuItem, JMenu, JCheckBoxMenuItem, JRadioButtonMenuItem. Tyto třídy mají i konstruktor s parametrem Action, který podporuje elegantní použití handleru. PJV10

Interfejs Action je extenze interfejsu java.awt.event.ActionListener. void actionPerformed( ActionEvent ev ) - zděděná metoda void addPropertyChangeListener( PropertyChangeListener pcl ) void removePropertyChangeListener( PropertyChangeListener pcl ) Object getValue( String key ) void putValue( String key, Object value ) boolean isEnabled( ) setEnabled( boolean b ) PJV10

AbstractAction implements Action metodu abstract actionPerformed však nekonretizuje. Je vhodným předkem pro tvorbu konkrétních handlerů. Přidává metody: PropertyChangeListener[ ] get PropertyChangeListeners( ) void firePropertyChange( String ptyName, Object oldVal, Object newVal ) Object[ ] getKeys( ) Akci lze spouštět i z několika komponent, mohou ukázat tentýž text a ikonu definovanou v handleru. Příkladmo: Action a = new Act1(); JButton b = new JButton(a); JMenuItem m = new JMenuItem(a); JTextField t = new JTextField(...); // no label and icon t.setAction(a); class Act1 extends AbstractAction { public Act1( ... ) { super( label, icon ); ... } public void actionPerformed( ActionEvent ev ) { ... } } PJV10

Metody paint a print Ve třídě JComponent jsou překryty a připsány metody pro kreslení a tisk. public void paint( Graphics g ) – defaultně volá tyto tři metody: public void paintComponent( Graphics g ) // tato komponenta public void paintBorder( Graphics g ) // její okraj public void paintChildren( Graphics g ) // vložené komponenty Kterákoliv z těchto čtyř metod může být přepsána. Metodu update( Graphics g ) Swing nevolá. Transparence vs. opacita komponent ovlivňuje efektivitu. V překrývající metodě je žádoucí nejprve volat super.paint( g ); Obdobně je řešen tisk metodami print ( Graphics g ) : printComponent, printBorder a printChildren. PJV10

Text Třída javax.text.JTextComponent zajišťuje služby pro své textové potomky: Model: document View: pro visualizaci Controller: editor kit Podpora undo/redo Caret, listenery a filtry Přímými potomky jsou třídy: JTextField JTextArea JEditorPane Pomocí tzv. stylů a atributů lze vytvořit pěkné texty. Navazují podbalíčky pro rtf a html. Lištu JMenuBar lze vložit do JFrame, JRootPane, JApplet, JDialog a JInternalFrame – nikoli však do JWindow. Lišta má být opacitní. PJV10

Řídící komponenty Buttons JComboBox JList JTextField JMenu JSlider PJV10

Informační komponenty editable JTextArea JTable JTree Colorchooser Filechooser not editable JLabel Progress bar Tool tip PJV10

Kontejnery Top-level JApplet JDialog JFrame JScrollPane JSplitPane Tabbed pane Tool bar JPanel PJV10

Speciální kontejnery Internal frame Layered pane Root pane PJV10

J komponenty JLabel JButton JTextArea JMenu JMenuBar JTextField javax.accessibilty JComponent Accessible J komponenty JLabel javax.swing.text Abstract Button JButton JText Component ListCell Renderer JToggle Button JCheckBox JEditor Pane DefaultList CellRenderer JText Pane JRadio Button BasicCombo BoxRenderer JMenuItem JTextArea MenuElement TableCell Renderer JMenu JMenuBar DefaultTable CellRenderer JTextField JCheckBox MenuItem JPopup Menu JFormatted TextField TreeCellRenderer JRadioButton MenuItem DefaultTree CellRenderer JPassword Field PJV10

J komponenty JPanel JList JScrollBar JSlider Box JTree JTable JToolBar javax.accessibilty JComponent Accessible J komponenty JPanel JList JScrollBar JSlider JColor Chooser Box JCombo Box JProgress Bar JSeparator JFile Chooser BoxLayout javax.swing.table JTree JTable JTable Header JToolBar JToolTip JSpinner JViewPort JSplit Pane JOption Pane JScroll Pane JRoot Pane JTabbed Pane JLayered Pane JDesktop Pane Layout=null PJV10

javax.swing InputMap ButtonModel ListModel SpinnerModel Abstract java.awt.event ButtonModel ListModel SpinnerModel ActionListener <E> Default ButtonModel Abstract ListModel Abstract SpinnerModel Action ComboBoxModel <E> <E> Abstract Action Spinner DateModel DefaultCombo BoxModel MutableCombo BoxModel <E> javax.swing.text <E> Spinner ListModel Text Action Default ListModel <E> Spinner NumberModel ButtonGroup DefaultList SelectionModel InputMap DefaultSingle SelectionModel ActionMap BoundedRangeModel Border Factory Component InputMap DefaultBounded RangeModel Input Verifier PJV10

javax.swing Popup Timer Graphics RGBImage Filter FilterInput Stream java.awt java.awt.image java.io java.awt.event Graphics RGBImage Filter FilterInput Stream Mouse Adapter Focus TraversalPolicy 5 Debug Graphics GrayFilter ProgressMonitor InputStream ToolTip Manager InternalFrame Focus TraversalPolicy javax.accessibilty AWTKeyStroke SortingFocus TraversalPolicy Icon Accessible DesktopManager ImageIcon DefaultDesktop Manager KeyStroke LayoutFocus TraversalPolicy java.util Hashtable Progress Monitor UI Defaults LookAndFeel Repaint Manager Popup Timer Size Requirements UI Manager Swing Utilities MenuSelection Manager Popup Factory Transfer Handler Size Sequence PJV10

SingleSelectionModel javax.swing java.awt SwingConstants LayoutManager java.lang java.util.concurrent java.awt Runnable Future WindowConstants LayoutManager2 <V> java.util.concurrent ViewPort Layout ScrollPaneConstants RunnableFuture 1.6 <V> Scrollable ScrollPane Layout Swing Worker Renderer 1.6 <T,V> Box Layout SingleSelectionModel Overlay Layout CellEditor Spring Layout Spring 1.4 TableCellEditor TreeCellEditor Group Layout Abstract CellEditor DefaultCell Editor 1.6 PJV10

javax.swing.event EventListener List EventListener PJV10 java.util DocumentEvent EventListener AncestorListener PopupMenuListener TableColumn ModelListener TreeModelListener CaretListener MenuDragMouseListener TableModelListener TreeWillExpandListener CellEditorListener MenuKeyListener TreeExpansionListener UndoableEditListener ChangeListener MenuListener TreeSelectionListener java.awt.event java.awt.event DocumentListener RowSorterListener MouseListener MouseMotionListener 1.6 5 2 HyperLinkListener InternaFrameListener 7 MouseInputListener ListDataListener InternalFrame Adapter 7 MouseInput Adapter ListSelectionListener PJV10

javax.swing.event AWTEvent Serializable EventObject Component Event java.util EventObject java.awt java.awt.event java.awt.event java.awt.event java.awt.event AWTEvent Component Event Input Event MouseEvent MouseWheel Event InternalFrame Event Ancestor Event MenuDrag MouseEvent ListData Event ListSelection Event Menu Event PopupMenu Event java.beans TableColumn ModelEvent Table ModelEvent TableExpansion Event Hyperlink Event Property ChangeSupport Tree ModelEvent TreeSelection Event Undoable EditEvent CaretEvent SwingProperty ChangeSupport PJV10

javax.swing.border Abstract Border Border 3 Třída JComponent umí vykreslit okolo komponenty různé okraje, což zlepšuje přehlednost a srozumitelnost. Abstract Border Serializable Bevel Border SoftBevel Border Compound Border Empty Border Matte Border Etched Border Line Border Titled Border PJV10

Demo: javax.swing.ProgressBar JProgressBar pb1 = new JProgressBar( orient, min, max ); pb1.setStringPainted( true ); // procenta na proužku pb1.setModel( new Mod( ) ); class Mod extends DefaultBoundedRangeModel implements Runnable { public Mod( ) { new Thread( this ).start( ); } public void run( ) { try { for ( int i = 0; i <= 100; Thread.sleep( 200 ), this.setValue( i = i+5 ) ) ; } catch ( InterruptedException ex ) { } } PJV10

javax.swing.table JTableHeader JComponent TableModel CellEditor TableColumnModel Abstract TableModel DefaultTable ColumnModel TableCellEditor JLabel TableColumn Model Listener DefaultTable Model DefaultCell Editor EventListener DefaultTable CellRenderer PropertyChange Listener TableCellRenderer RowSorter ListSection Listener <M> Default RowSorter Table Column <M,I> Table RowSorter TableString Converter <M> PJV10

javax.swing.table (1/2) public class TableTest extends Jframe implements TableModelListener { Object data [ ][ ] = new Object [4] [3] ; // fill String or Integer … String [ ] names = { "AAA", "BBB", "CCC", }; // column names TableModel tm = new DefaultTableModel( data, names ); JTable ta = new JTable( ); public TableTest() { ta.setModel( tm ); tm.addTableModelListener(this); JScrollPane sp = new JScrollPane( ); sp.setViewportView( ta ); Container co = this.getContentPane( ); co.add( sp ); } PJV10

javax.swing.table (2/2) public void tableChanged(TableModelEvent e) { TableModel m = (TableModel)e.getSource(); int col = e.getColumn(); int row = e.getFirstRow(); Object x = m.getValueAt( row, col ); // get something … m.removeTableModelListener(this); // disable event acceptance m.setValueAt( z, i, j ); // store something m.addTableModelListener(this); ); // enable event acceptance } PJV10

javax.swing.tree TreeNode TreeModel TreePath DefaultTree Model TreeSelectionModel TreePath DefaultTree Model MutableTreeNode DefaultTree SelectionModel DefaultTree MutableModel RowMapper Abstract LayoutCache JLabel FixedHeight LayoutCache TreeCellEditor DefaultTree CellEditor DefaultTree CellRenderer VariableHeight LayoutCache TreeCellRenderer PJV10

javax.swing.text View Composite View Box View Component View Form View Block View List View AsyncBox View Object View Flow View Paragraph View Glyph View Label View Table View Zone View Icon View TabableView Image View Wrapped PlainView TabExpander Plain View Field View Password View PJV10

javax.swing.text (part) Document StyledDocument EditorKit Abstract Document DefaultStyled Document Document Filter Default EditorKit Plain Document HTML Document StyleContext Styled EditorKit Segment StyleSheet HTML EditorKit Element Position Caret RTF EditorKit DefaultCaret AttributeSet Style MutableAttributeSet Highlighter Simple AttributeSet Layered Highlighter Utilities PJV10