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