
9a4c187f1023a71f9ad0df737c0bedb6.ppt
- Количество слайдов: 157
Desktop Java En Action Romain Guy Swing Team Sun Microsystems
Agenda • Aperçu Desktop Java • Fundamentals > > Databinding Swing. X/JDIC Projets tierces parties Effets graphiques avec Swing • Outils • Q&R
Agenda • Aperçu Desktop Java • Les Fondamentaux > > Databinding Swing. X/JDIC Projets tierces parties Effets graphiques avec Swing • Outils • Q&R
Citation de la semaine: “Swing is the dominant GUI toolkit” Evans Data Report, Printemps 2005 http: //weblogs. java. net/blog/hansmuller
Qu’est-ce que Java pour Desktop ? • GUI Puissant, Graphismes, et des outils de déployement & APIs
Qu’est-ce que Desktop Java? • . . . en combinaison avec le reste de la plateforme Java SE
Qu’est ce que Desktop Java? • . . . Et des frameworks optionnels
Qu’est ce que Desktop Java? • . . . tournant sur toutes les plateformes bureautiques importantes
Qu’est-ce que Desktop Java?
Desktop Java Aujourd’hui: Développeurs • 4. 5 millions de développeurs Java professionnels • À quoi les développeurs Java passent leur temps (Evans Data, 2005): > 43%: Applications bureautiques et applets > 41%: Servlets, EJBs, JSPs > 4%: Mobile • “Swing is the dominant GUI toolkit” > Evans Data, Printemps 2005 > Comparaison de Swing avec MFC, Win. Forms, et autres
Desktop Java Aujourd’hui: Utilisateurs • 87% des PCs ont Java VM (de Sun ou Microsoft) • >50% des PCs ont une Java VM de Sun • PC OEMs: 60% des nouveaux PC sont couverts par des accords de distribution pour livrer les JVM de Sun • téléchargement java. com: > Quadruplé jusqu’à 15 -20 millions de téléchargement/mois > Taille téléchargement 7 Mo (mises à jour sont en-dessous de 2 Mo) > Taux de succès d’installation >95% sur le
Téléchargements: Quelques Données historiques
Téléchargement : Tailles Application/Plateforme Taille (Mo) Flash 1. 3 Google Desktop 1. 4 Limewire 2. 2 Ad-Aware 1. 06 2. 7 Win. Zip ICQ 5. 04 4. 1 Firefox 1. 0. 7 (Windows) i. Mesh Thunderbird 1. 0. 7 Azureus 6. 9 MSN Messenger 7. 0 J 2 SE JRE 1. 5. 0_05 3. 9 4. 7 5. 0 5. 8 7. 1 Application/Plateforme Taille (Mo) Div. X Player Firefox 1. 0. 7 (Linux) AOL AIM 8. 3 Trillian Zone. Alarm 8. 9 Real. Player 9. 6 Mozilla 1. 7. 12 Google Earth Quicktime (Windows) Windows Media Player 12. 1. NET Framework 2. 0 23 i. Tunes 6 34. 5 7. 4 8. 2 8. 6 11. 0 11. 2 11. 7
Lime. Wire: Java on the large scale • Application de partage de fichiers très populaure, top 5 sur download. com depuis plus de 2 ans (total de 68 m)
Yahoo! Sitebuilder: Éditeur HTML
Grokker: front-end Recherche
Maple: Java dans la communauté scientifique • Mathematical problem solver • Interactive technical applications • Utilisé dans 95% des universités • Environs 3 millions d’utilisateurs
map 24. com: Interactive mapplets • Site de mapping par défaut pour Yahoo! Europe • Jusqu’à 1 million d’ applets Java délivrées chaque jour
pogo. com: #1 casual gaming site
Quantrix: Financial modeling
Blog. Bridge: RSS feed reader
Performance • Cours d’Histoire: > Les jours anciens (J 2 SE 1. 2) Nouvelle couche graphique (Java 2 D, Swing) + runtime interprété + vitesse du matériel à cette époque Performance peu satisfaisante > Depuis lors: compilateur Hotspot (1. 3) + accélération graphique matérielle (1. 4) + travail continu sur la performance (1. 3, 1. 4, 1. 5, 6, . . . ) + matériel plus rapide Performance excellente
Histoire Performance Java SE Server benchmark: Volano 2. 5. 0. 9 Sun JVMs are 32 -bit Sun Fire V 490: Solaris 9 / SPARC Volano Website: http: //www. volano. com Source: Java Performance Engineering
Histoire Performance Java SE Server benchmark: Sci. Mark 2 Sun JVMs are 32 -bit Sun Fire V 490: Solaris 9 / SPARC Sci. Mark 2 Website: http: //math. nist. gov/scimark 2/ Source: Java Performance Engineering
Histoire Performance Démarage Java SE 1. 5 GHz Athlon, 512 MB, Linux 2. 4. 20
Intégration Desktop • Les applications Java peuvent fonctionner et s’intégrer comme des applications natives: > Icônes dans le menu démarrer, system tray (Windows) > Dock integration (Macintosh) > Splash screen au démarrage > APIs pour s’intégrer dans les services de desktop standards (client mail par défaut, lecteurs documents, navigateurs, etc. )
Intégration Desktop : Devient Native • Semble native quelque soit votre plateforme
Mais si vous devez la personnalier. . . • http: //napkinlaf. sourceforge. com: > “semble comme si c’était élaboré sur le coin d’une nappe”
Déploiement d’Application • 3 modèles de déploiement: > Applet: s’exécute dans le conteneur du navigateur > sécurisée (s’exécute dans le “bac à sable” de sécurité par défaut) > UI familière du navigateur > Application Java. Web. Start: > Se télécharge depuis le navigateur, s’exécute indépendamment > Intégration avec le bureau > sécurisée (s’exécute dans le “bac à sable” de sécurité par défaut) > Mécanisme de mise à jour transparent > Utilisation offline
JMX Big. Decimal z-ordering jstat RMI dynamic proxies updates Generics Gnome Skins jps JDBC Rowsets Autoboxing extended for loop faster startup jconsole printf JVM sharing synth L&F SAX 2. 0 Concurrency utilities Unicode Surrogates importing constants Open. GL IP reachability. Ocean L&F SASL performance XAWT unsynchronized String. Buffer cookie support DOM 3 improved. Monitoring XML Schema apt JVM fatal error handlers Stack trace API Remote JMX improved footprint varargs swing printing AMD 64 Enumerated types metadata OCSP XDn. D Packed JARs New Memory Model scanning JVMPI Profiling Tiger performance ergonomics
Desktop Java dans Tiger • Swing > > > Look a Feels natif GTK, XP Thème Ocean pour Metal Synth JTable printing JFrame. add() • AWT > XAWT
Desktop Java dans Tiger • Java 2 D > > Managed Images Partout re-architecture des Polices Amélioration Image. IO Amélioration des Performances • Déploiement > Consolidation Plugin/Webstart > Pack 200 > Nombreuses amélioration webstart et plugin
Swing: Look & Feels • Look & Feels Natifs: GTK et Windows XP
Swing: Look & Feels • Nouveau Thème pour le L&F Multi. Ancien Thème Nouveau thème Plateforme “Steel” “Ocean”
Swing: Look & Feels • Look & Feel Synth
MBeans metadata. JTable upgrades Compiler API Longhorn Look & Feel Split Verifier Windows system tray Unicode Normalizer Services Attach on demand chmod Core JVM Swing. Worker Annotation processors Parallel old-space GC performance Splash screens Parallelize Concurrent GC JConsole upgrades Mustang Web Services Stack JVM DTrace Password prompting Docs in JDBC 4. 0 Java. Doc Tags LCD fonts Free disk space Faster JNI Chinese More gfx acceleration JAXB 2. 0 JVM & CLR Co-Existence Improved OOM diagnosability More desktop integration Pluggable Locales Fire. Fox support Scripting Languages Native L&F Fidelity HTTP cookie manager XAWTJava. Script engine More GC Ergonomics XML digital signatures Improved text rendering
Swing dans Mustang • Plus de rectangle gris > double-buffering par fenêtre • Look & Feel Natif amélioré > Meilleur sur les plateformes existantes, permet les plateformes futures (par exemple, Vista) • Améliorations Layout > Support Baseline • Fixes au niveau Drag & Drop • Tri & Filtrage JTable • Swing. Worker mis à jour et intégration
Swing dans Mustang • Plus de rectangles glis > double-buffering par fenêtre • Look & Feel Natif amélioré > Meilleur sur les plateformes existantes, permet les plateformes futures (par exemple, Vista) • Améliorations Layout > Support Baseline • Fixes au niveau Drag & Drop • Tri & Filtrage JTable • Swing. Worker mis à jour et intégration
Java 2 D dans Mustang • Texte LCD > Utilisation de RVB des écrans LCD pour amélioration anti-aliasing du texte
Java 2 D dans Mustang • Qualité des Petits cercles > Plus de “pneus plats” • Rendu en un seul thread > Évite la fragile interdépendance des threads > Travaille mieux avec les drivers et matériels graphiques > Meilleures performances > amortizes API calls into larger batches of operations > Open. GL (pas par défaut) rendering pipeline only this release
http: //mustang. dev. java. net Copyright © 2005 Sun Microsystems 41
Mustang Snapshots • Nouvelle version disponible chaque semaine • Binaires pour l’évaluation et les tests > Par absolument n’importe qui • Sources pour la collaboration de la communauté > Par n’importe quel membre de la communauté JDK > Requiert l’acceptation de la licence JRL http: //mustang. dev. java. net
Java Distribution License (JDL) • Commercial redistribution license > Principal successeur à la SCSL > commercial use license simplifiée (plus lisible) • Inclut les principaux termes commerciaux de la SCSL > Requiert le passage du TCK > Inclut la licence TCK > Optional support agreement
Java Internal Use License (JIUL) • Les Enterprises peuvent déployer leurs propres bugfixes EN INTERNE > Sun peut forcer la compatibilité mais ne requiert pas de passer le TCK > Honor system - “Aux propres risques de l’Utilisateur” > Quelques recommendations: pas de modifications de l’API • Pour usage interne, entre 4 murs > Y compris les websites accessibles publiquement > Exclus les distributions externes • Permet le partage desbugfixes > Encourage mais n’oblige pas à partager les fixes
Agenda • Aperçu Desktop Java • Fundamentals > > Databinding Swing. X/JDIC Projets tierces parties Effets graphiques Swing • Outils • Q&R
Swing. Labs • Laboratoire Open Source • Exploration de nouvelles façons de créer des applications Swing > Plus facilement > Plus rapidement > Prettier • Projet Ombrelle > Swing. X > Databinding > Incubator
Fundamental Teasers • Swing. Labs
Fundamental Teasers • Drop Shadow
Fundamental Teasers • Collage
Fundamental Teasers • Joplin
Fundamentals Agenda
Fundamentals Agenda
Databinding • Définition > Exposition automatique des modèles de données dans un interface utilisateur. La valeur du modèle et son GUI restent synchronisées. • Exemple
Databinding: Roundup • Borland VCL (Delphi/C++ Builder) • MS Win. Forms/ASP. NET (Visual Studio. NET) • Braveheart (Java Studio Creator 2) • JFace Data Binding (Eclipse v 3. 2) • db. Swing/Data. Express (JBuilder) • JGoodies • Oracle ADF (JDeveloper) • Swing. Labs (Net. Beans. . . )
Swing. Labs Binding Design Goals • Primary Goals > Simplify building data oriented GUIs > For example, trivialize “master/detail” style database front-ends > Tool Support > Validation support > Works with multiple toolkits/tiers (web vs client) • Secondary Goals > Extensible > Testable
Swing. Labs Binding 101 • Domain Data > Swing. Labs Data. Set, Java. Beans, DOM • GUI Components • Binding "glue"
Data. Model Requirements • Encapsulate arbitrary data structures > Common API for all data types > Simplify job of data-aware component authors > API allows you to access the underlying data • Notify the UI when data is changed • Data. Models represent > > tables (many columns and many rows) lists (a single column with many rows) records (many columns and a single row) scalars (a single column and single row)
Data. Model (Hierarchical) • Data. Models may be nested > 0 or 1 parent > 0 or more children • A child wraps the contents of a single cell
Replace" src="https://present5.com/presentation/9a4c187f1023a71f9ad0df737c0bedb6/image-60.jpg" alt="Binding "Glue" Requirements • Adapt a UI Component to a Data. Model > Replace" />
Binding "Glue" Requirements • Adapt a UI Component to a Data. Model > Replace the Components model(s) where appropriate > Restore the Component to its original state when unbound • Enable new Binding implementations > Most applications need custom components, requiring custom bindings • Provide hooks for validation
Requirements pour la Validation • Flexible > Pattern Observer > Personnalisation de l’affichage des messages et erreurs • Rich Feedback > Plusieurs messages de validation peuvent être générés depuis un seul événement de validation • Plug into Binding framework > Bindings va générer les événements de Validation automatiquement
Validation: GUI • Différent moments de validation > Touche pressée > Focus perdu > Commit • Nombreux feedback visuels • Marqueurs “Obligatoire” • Conseils de Validation > Utiles pour les humains
Validation • Basé sur la Validation de JGoodies • Grande API, implémentation très utile • Apache Jakarta Commons Validation > Pas une option > Trop orienté web > Manque du feedback visuel > Pleins d’implémentations courantes très utiles > Email. Validator > URLValidator > etc.
Exemple Validation Validator validator = new Email. Validator(); //our impl Validation. Result result = validator. validate("bad@email"); for (Validation. Message msg : result. get. Messages()) { System. out. print(msg. get. Severity() + “: ”); System. out. println(msg. formatted. Text()); } //a fictional component for displaying results JXValidation. Panel pnl = get. Validation. Panel(); pnl. set. Result(result);
Swing. X: Composants Data Aware • Swing. X fournit des composants data aware • Swing. X fournit des implémentation Binding. Context > JXFrame, JXDialog, JXRoot. Pane > Agissent comme des conteneurs de données > Meilleur support par les outils • Propriété data. Path spécifie la donnée à lier > "cust. first. Name" > "cust[@selected]. orders[@sel_orders]. number "
Exemple: Composants Swing. X public class My. Panel extends JPanel { Binding. Context ctx; public void init. Components() { ctx = new Binding. Context(); news. List = new org. jdesktop. swingx. JXList(); news. List. set. Data. Path("news"); news. List. set. Display. Field. Name("subject"); news. List. set. Binding. Context(ctx); } } body. Area = new org. jdesktop. swingx. JXText. Area(); body. Area. set. Data. Path("news[@selected]. body"); body. Area. set. Binding. Context(ctx); //. . . public void bind. Components() { List
Exemple: Composants Swing. X public class My. Panel extends JXPanel { Binding. Context ctx; public void init. Components() { ctx = new Binding. Context(); news. List = new org. jdesktop. swingx. JXList(); news. List. set. Data. Path("news"); news. List. set. Display. Field. Name("subject"); news. List. set. Binding. Context(ctx); } } body. Area = new org. jdesktop. swingx. JXText. Area(); body. Area. set. Data. Path("news[@selected]. body"); body. Area. set. Binding. Context(ctx); //. . . public void bind. Components() { List
Exemple: Composants Swing. X public class My. Panel extends JXPanel { public void init. Components() { news. List = new org. jdesktop. swingx. JXList(); news. List. set. Data. Path("news"); news. List. set. Display. Field. Name("subject"); } } body. Area = new org. jdesktop. swingx. JXText. Area(); body. Area. set. Data. Path("news[@selected]. body"); //. . . public void bind. Components() { List
Agenda Fundamentals
Swing. X – Swing Extensions • Composants Swing Améliorés > Table/List highlighting, sorting, and filtering > Data aware > Auto completion • Nouveaux Composants Swing. X > Built atop Swing > JXTree. Table, JXImage. Panel, JXDate. Picker • Candidats possibles pour migrer vers le JDK • Beaucoup de contributions d’autres projets > L 2 FPROD, JGA, JGoodies
Swing. X: JXTable • Étends JTable pour fournir : > > > Tri Filtre Highlighting conditionnel Recherche Contrôle visibilité colonne • Tri & Filtre ont migré vers Java 6. 0
Swing. X: Copie Écran JXTable
Swing. X: Code Exemple JXTable news. Table = new org. jdesktop. swingx. JXTable(); news. Table. set. Column. Control. Visible(true); news. Table. set. Show. Horizontal. Lines(false); news. Table. set. Show. Vertical. Lines(false); news. Table. set. Highlighters( new Highlighter. Pipeline( new Highlighter[] { Alternate. Row. Highlighter. classic. Line. Printer } ) ); news. Table. pack. All();
Swing. X: JXTree. Table • Un JTree avec plusieurs colonnes • Display hierarchical multi property values • Exemples Simples > Email inbox (threaded message view) > Organizational Chart • Tout comme JXTable, supporte > Filtre > Highlighting > Recherche
Swing. X: Copie Écran JXTree. Table
Swing. X: Code Exemple JXTree. Table tree. Table. get. Table. Header(). set. Tool. Tip. Text("" + " Sorting:
" + "Not supported
" + " Auto-Resizing:
" + "Double-Click in resize region" + ""); tree. Table. set. Root. Visible(true); tree. Table. set. Shows. Root. Handles(false); tree. Table. set. Highlighters( new Highlighter. Pipeline( new Highlighter[] { Alternate. Row. Highlighter. classic. Line. Printer } ) ); tree. Table. pack. All();
Swing. X: JXPanel • Fournit API translucide > Tous les composants d’un JXPanel héritent de la translucidité > JXPanel peut surcharger la translucidité d’un JXPanel parent > Un bon remplaçant pour JPanel • Égalements d’autres sous-classes utiles > > > JXImage. Panel JXLogin. Panel JXCollapsible. Panel JXTitled. Panel JXGlass. Box
Swing. X: Copie Écran JXPanel
Swing. X: Copie Écran JXPanel
Swing. X: Code Exemple JXPanel Border shadow. Border = /* shareable border */ new Drop. Shadow. Border(UIManager. get. Color("Control"), 0, 8, . 5 f, 12, false, true, true); JXTitled. Panel toc = new JXTitled. Panel("Table of Contents"); JXTitled. Panel info = new JXTitled. Panel("Information"); JXTitled. Panel demo = new JXTitled. Panel("Demo"); toc. set. Border(shadow. Border); info. set. Border(shadow. Border); demo. Panel. set. Border(shadow. Border); // Set transluscency to 30% until user clicks on TOC info. set. Alpha(. 3 f); demo. set. Alpha(. 3 f);
Swing. X: Copie Écran JXImage. Panel
Swing. X: JXImage. Panel Code Sample image. Panel = new org. jdesktop. swingx. JXImage. Panel(); try { Image image = Image. IO. read( get. Class(). get. Resource("aerith_logo. png")); image. Panel. set. Image(image); } catch (IOException ex) { }
Swing. X: JXTitled. Panel
Swing. X: JXTitled. Panel toc = new JXTitled. Panel("Table of Contents"); JXTitled. Panel info = new JXTitled. Panel("Information"); JXTitled. Panel demo = new JXTitled. Panel("Demo"); JXPanel content = new JXPanel(); //Configure the content panel here. Point is, this //is just a Container //. . . demo. set. Content. Container(content);
Swing. X: JXCollapsible. Pane • Une extension de JPanel qui peut étendre ou refermer son contenu avec une animation et des effets de fade in/fade out. • Utilisé par JXTask. Pane • JXCollapsible. Pane a une action par défaut enregistrée sous le nom de TOGGLE_ACTION
Swing. X: JXCollapsible. Pane
Swing. X: JXCollapsible. Pane
Swing. X: JXCollapsible. Pane
Swing. X: JXCollapsible. Pane
Swing. X: JXCollapsible. Pane (code) JXCollapsible. Pane pane = new JXCollapsible. Pane(); Action. Map map = pane. get. Action. Map(); Action a = map. get(JXCollapsible. Pane. TOGGLE_ACTION); JButton button = new JButton(a);
Swing. X: JXTask. Pane • Conteneur pour des tâches (représentés par des JXHyperlinks) ou d’autres composants arbitraires • Habituellement regroupés dans un JXTask. Pane. Container • Conçu en collaboration avec Frédéric Lavigne (L 2 FPROD)
Swing. X: Copie Écran JXTask. Pane
Swing. X: JXTask. Pane (code) // a container to put all JXTask. Pane together JXTask. Pane. Container task. Pane. Container = new JXTask. Pane. Container(); // create a first task. Pane with common actions JXTask. Pane action. Pane = new JXTask. Pane(); action. Pane. set. Title("Files and Folders"); action. Pane. set. Special(true); // actions can be added, an hyperlink will be created Action rename. Selected. File = create. Rename. File. Action(); action. Pane. add(rename. Selected. File); action. Pane. add(create. Delete. File. Action()); // add this task. Pane to the task. Pane. Container. add(action. Pane);
Swing. Labs Incubator • Place pour partager du code prototype en relation avec Swing. Labs • Tous les membres de la communauté qui a signé le JCA peut recevoir l’accès en écriture (commit) • Lorsque l’idée est mature, elle peut être “promouvée” • Incubator cool code > JIcon. File > Drop. Shadow. Panel & Shadow. Factory > JComponent. Combo. Box
DEMO Drop shadow Panel
Incubator: Drop. Shadow. Panel (code) drop. Shadow. Panel = new Drop. Shadow. Panel(new Border. Layout()); drop. Shadow. Panel. set. Distance(10); drop. Shadow. Panel. set. Angle(45. 0 f); drop. Shadow. Panel. add(picture); JPanel buttons = new JPanel(); buttons. set. Opaque(false); buttons. add(new JButton("About")); buttons. add(new JButton("Exit")); drop. Shadow. Panel. add(buttons, Border. Layout. SOUTH); JPanel debug. Pane = build. Debug. Pane(); debug. Pane. set. Opaque(false); drop. Shadow. Panel. add(debug. Pane, Border. Layout. EAST);
Swing. Labs: JDIC • JDesktop Integration Components • Sous-projet dédié à l’intégration native > Web. Browser > Tray. Icon • Inclut incubator avec des composants expérimentaux > Icon Service > File. Util > get. Free. Space(File file) > recycle(File file) > Music Player Control API
DEMO JDIC Web. Browser
JDIC: Web. Browser (code) public Browser. Window() { init. Components(); try { browser = new Web. Browser(); browser. set. URL(new URL("http: //swinglabs. org")); } catch (Malformed. URLException ex) { ex. print. Stack. Trace(); } browser. Panel. add(browser); get. Root. Pane(). set. Default. Button(go. Button); }
Fundamentals Agenda
Vous ne pourrez plus pirater les logiciels Sun! • Java Enterprise System > Suite complète de middleware > Intégré et multi-plate-formes • Vente a l'employé > Vente à la CPU disponible • Accès libre au logiciel, y compris en production, sans support de tout Java ES > Si besoin de support, retour au cas ci-dessus
Roadmap Java • Java SE 5. 0 (tiger) : sept 2004 • Java SE 6 (mustang) : printemps 2006 • Java EE 5 : printemps 2006 > EJB 3 (POJO + persistance) > JSF 1. 2 http: //www. jcp. org
Glass. Fish • Le serveur Java EE 5 Open Source de Sun • Disponible aujourd'hui (quasi toutes les features) • Pour apprendre Java EE 5 (blueprints) • Innovations > Grizzly, Managenet WS, Toplink, outils admin, load on-demand • Outils disponibles aujourd'hui (Net. Beans, . . . )
Outils de développement • • • GRATUITS Net. Beans. org (Open Source) Sun Java Studio Creator 1 & 2 (JSF RAD) Sun Java Studio Enterprise 8 (UML) Sun Studio 11 http: //developer. sun. com
Helpful 3 rd Party Libraries • JGoodies > > > Looks Forms Binding Validation Animation • JFree. Chart • JFree. Report & Jasper. Report • . . . and many more o/
3 rd Party: JGoodies • http: //www. jgoodies. com • http: //jgoodies. dev. java. net
3 rd Party: JFree. Chart • http: //www. jfree. org/jfreechart
3 rd Party: JGraph • http: //www. jgraph. com
3 rd Party: Wing. Z • http: //www. zvalley. com
3 rd Party: Many More! • Check out the Swing Depot web site > http: //www. javadesktop. org/rollups/component s • Lists high-quality Swing components • Open Source and commercial offerings • Useful for all kinds of applications > General purpose > Graphs, diagrams > Date choosers
Fundamentals Agenda
FX Agenda • • Introduction Glass pane magic Animation Photo Collage > Combinaison animations et glass pane magic > Astuces de Performance • Aller plus loin
FX Agenda • • Introduction Glass pane magic Animation Photo Collage > Combinaison animations et glass pane magic > Astuces de Performance • Aller plus loin
FX: Pourquoi S’En Soucier? • Meilleure expérience utilisateur > Eye candy sells. . . >. . . and brings better ergonomics > Professional polish • Demandez-vous: “Pourquoi j’utilise JGoodies? " • C’est beaucoup de plaisir • Ce n’est pas si difficile • I mean it!
FX: Le Ciel est la Limite • Swing toolkit > Hautement flexible > Chaque composant peut être personnalisé > Conçu au-dessus de Java 2 D • Java 2 D > API de dessin de haute qualité, et compréhensible > Architechture extensible > Abstraction du Device > Cela peut se passer à l’écran, à l’impression, dans un PDF. . . > Accélération matérielle
FX Agenda • • Introduction Glass pane magic Animation Photo Collage > Combinaison animations et glass pane magic > Astuces de Performance • Aller plus loin
FX: Glass Pane Magic • Applications exécutent des tâches de durée inconnue • Solutions Possibles > Montrer le sablier > Utilisier une JProgress. Bar indéterminée (damn Cylon!) > Désactiver les composants • Cela fonctionne and they're not pretty • La solution de l’homme moderne > Utilise le glass pane > Utilise une forme circulaire (après tout, Apple
FX: Glass Pane Magic • Qu’est ce que le glass pane?
DEMO Infinite Progress Panel
FX: Glass Pane Magic • Premièrement , créez votre propreglass pane > Extends JComponent, JPanel. . . public class Infinite. Progress. Panel extends JComponent { @Override protected void paint. Component(Graphics g) { g. set. Color(new Color(255, alpha. Level)); g. fill. Rect(0, 0, get. Width(), get. Height()); // paint the rest } } > Et set. Opaque()?
FX: Glass Pane Magic • Ensuite, bloquez les entrées public class Infinite. Progress. Panel extends JComponent { public void set. Visible(boolean visible) { if (visible) { set. Focus. Traversal. Keys. Enabled(false); add. Mouse. Listener(new Mouse. Adapter() { }); add. Mouse. Motion. Listener(new Mouse. Motion. Adapter() { }); add. Key. Listener(new Mouse. Adapter() { }); super. set. Visible(true); request. Focus. In. Window(); } else { // undo } } } > Focus ne peut être requis que si visible
FX: Glass Pane Magic • Finallement, installer votre glass pane public Woot. Demo extends JFrame implements Action. Listener { public Woot. Demo() { super("w 00 t"); set. Glass. Pane(new Infinite. Progress. Panel()); } } public void action. Performed(Action. Event evt) { get. Glass. Pane(). set. Visible(true); } > Souvenez-vous, un glass pane est invisible lorsqu’il est installé • http: //swingfx. dev. java. net
FX: More Glass Pane Magic • http: //www. jroller. com/page/gfx/Archives • Jon Lipsky: http: //blog. elevenworks. com/? p=7
FX Agenda • • Introduction Glass pane magic Animation Photo Collage > Combinaison animations et glass pane magic > Astuces de Performance • Aller plus loin
FX: Animation • Pourquoi les animations sont-elles utiles? > Le GUI apparait avoir plus de répondant > Meilleur capture visuelle de ce qui se passe > Transitions sont plus réalistes • Comment créer des animations? > javax. swing. Timer > Chet's Timing Framework > Karsten's JGoodies Animation library
DEMO Drop in Motion
FX: Animation Timer • Créer un timer > This one runs at 60 fps private void start. Animation() { Timer animation = new Timer(1000 / 60, new Animation()); animation. start(); } • Créer le handler private class Animation implements Action. Listener { public void action. Performed(Action. Event evt) { } }
FX: Animation Handler • Timing n’est pas garanti > Timer est dépendant de la plateforme > Utilisation Massive du CPU peut affecter le timer > Ne Jouez pas une frame d’animation par événement reçu • Savoir où vous situé dans le temps > f(elapsed time) -> [0, 1] > Très souvent, un cycle, pas de répétition > f(elapsed time) = elapsed time / delay
FX: Animation Handler private long start; private boolean is. Initialized; private Animation() { is. Initialized = false; } public void action. Performed(Action. Event e) { if (!is. Initialized) { start = System. current. Time. Millis(); is. Initialized = true; } } long elapsed = System. current. Time. Millis() - start; if (elapsed > DELAY_ANIMATION) { ((Timer) e. get. Source()). stop(); } else { double time = (double) elapsed / (double) DELAY_ANIMATION; //. . . repaint(); }
FX: Comportement Animation • La valeur du temps ne fonctionne pas bien pour le mouvement > Nous avons besoin de notre position dans l’espace > g(f(elapsed time)) -> [0, 1] • Maintenant, nous pouvons dessiner > > Tailles des icônes sont réadaptées Taille de l’ombre est réadaptée Modification distance pénombre Modification opacité de la pénombre
DEMO Drop in Motion, Equation
FX: Animation Behavior • Pour dessiner avec notre “cool” équation private void draw. Item(Graphics 2 D g 2) { double position = equation. compute(time); float alpha = 1. 0 f - (0. 5 f * (float) position); Composite old = g 2. get. Composite(); Composite c = Alpha. Composite. get. Instance(Alpha. Composite. SRC_OVER, alpha); g 2. set. Composite(c); // draw shadow first g 2. set. Composite(old); int width = (int) (image. get. Width() / 2 * (1. 0 + position)); int height = (int) (image. get. Height() / 2 * (1. 0 + position)); } g 2. draw. Image(image, drop. X, drop. Y, width, height, null);
FX: Animation Timer Drawbacks • A lot of boilerplate • Les animations complexes sont difficiles > Beaucoup de cycles > Va et Viens > Répétition • Chet's Timing Framework > Gère tout pour vous • JGoodies Animation > Makes simple animations easy > Go see him on Thursday
FX Agenda • • Introduction Glass pane magic Animation Photo Collage > Combinaison animations et glass pane magic > Astuces de Performance • Aller plus loin
FX: Aperçu Photo Collage • Un simple photo viewer • Vous pouvez créer des collages > Comme dans Google Picasa • Une application Swing avec : > Aucun curseurs de souris Tirer-Lâcher affreux. Des Animations > Des vignettes de Hautes qualités
DEMO Photo Collage
FX: Photo Collage Drag & Drop • Tout est fait sur le glass pane > Un JPanel non opaque • Le glass pane doit > Dessiner une image spécifique > À une position donnée • Drag source et drop targets > Définit l’image avec glass. Pane. set. Image() > Définit la position glass. Pane. set. Position()
FX: Photo Collage Drag & Drop • Performance issues can be tricky > Appels à repaint() sont chers public void set. Point(Point location) { this. old. Location = this. location; this. location = location; } public Rectangle get. Repaint. Rect() { int x = location. get. X(); int y = location. get. Y(); int x 2 = old. Location. get. X(); int y 2 = old. Location. get. Y(); } Rectangle old. Pic = new Rectangle(x 2, y 2, width, height); return new Rectangle(x, y, width, height). union(old. Pic);
FX: Photo Collage Drag & Drop • Lorsque la souris bouge, appelez repaint(Rectangle) public void drag. Mouse. Moved(Drag. Source. Drag. Event dsde) { JRoot. Pane root = Swing. Utilities. get. Root. Pane(this); Ghost. Glass. Pane glass. Pane = (Ghost. Glass. Pane) root. get. Glass. Pane(); Point p = (Point) dsde. get. Location(). clone(); Swing. Utilities. convert. Point. From. Screen(p, glass. Pane); glass. Pane. set. Point(p); glass. Pane. repaint(glass. Pane. get. Repaint. Rect()); }
FX: Photo Collage Astuces • Utiliser des images compatibles > Images JPEG peuvent ne pas être compatibles > Performance améliorée par un facteur de 20 public static Buffered. Image create. Compatible. Image(Buffered. Image image) { Graphics. Environment e = Graphics. Environment. get. Local. Graphics. Environment(); Graphics. Device d = e. get. Default. Screen. Device(); Graphics. Configuration c = d. get. Default. Configuration(); Buffered. Image compatible. Image = c. create. Compatible. Image(image. get. Width(), image. get. Height()); Graphics g = compatible. Image. get. Graphics(); g. draw. Image(image, 0, 0, null); g. dispose(); } return compatible. Image;
FX: Photo Collage Astuces • Ne jamais appeler get. Scaled. Instance(), utilisez draw. Image() > Logiciel vs Matériel double ratio = (double) image. get. Width() / (double) image. get. Height(); int width = ITEM_WIDTH; int height = (int) (width / ratio); g 2. draw. Image(image, x, y, width, height, null);
FX: Photo Collage Astuce • Bilinear et bicubic resizing ne sont pas parfait > Lorsqu’on réduit de plus de la moitier > Procéder étapes par étapes > Technique similair à to mipmapping dans les jeux • Resizing demo > L’une utilise draw. Image() et bilinear interpolation > L’autre utilise une méthode personnalisée
DEMO Photo Collage, Resizing
FX: Photo Collage Astuce public static Buffered. Image create. Thumbnail(Buffered. Image image, int thumb. Width) { int width = image. get. Width(); float ratio = (float) width / (float) image. get. Height(); Buffered. Image thumb = image; do { width /= 2; //. . . Buffered. Image temp = new Buffered. Image(width, (int) (width / ratio), Buffered. Image. TYPE_INT_ARGB); Graphics 2 D g 2 = temp. create. Graphics(); g 2. set. Rendering. Hint(. . . ); g 2. draw. Image(thumb, 0, 0, temp. get. Width(), temp. get. Height(), null); g 2. dispose(); thumb = temp; } while (width != thumb. Width); } return thumb;
FX: Photo Collage Astuce • Ce n’est pas plus lent! > En fait, pas trop > ~= 15 ms vs ~= 0 ms for 640 x 480 > Vous pouvez mettre le résultat en cache • Beaucoup plus rapide que get. Scaled. Instance() • Semble meilleur qu’un simple draw. Image()
FX Agenda • • Introduction Glass pane magic Animation Photo Collage > Combinaison animations et glass pane magic > Astuces de Performance • Aller plus loin
DEMO Music Shelf
DEMO Twinkle
FX: Aller Plus Loin • Extreme GUI Makeover, Java. One 2005 TS-3605 > http: //developers. sun. com/learning/javaoneonli ne/ • Jon Lipsky's blog > http: //blog. elevenworks. com/ • Romain Guy's blogs > http: //jroller. com/page/gfx > http: //weblogs. java. net/blog/gfx • Santhosh Kumar's blog > http: //www. jroller. com/page/santhosh
FX: Aller Plus Loin • Swing. X > http: //www. swinglabs. org • Swing. Labs Incubator, FX module > http: //jdnc-incubator. dev. java. net • Swing. FX project > http: //swingfx. dev. java. net • JGoodies (and Karsten's session on Thursday) > http: //jgoodies. dev. java. net • Client. Java > http: //www. clientjava. com
Fundamentals Agenda
Outils: Utilisez-les et soyez heureux • Outils tendent à nous rendre plu productifs > > Integration avec un contôle de code source Débogueur intégré Assistance à l’encodage Support Refactoring • Les Outils de GUI ne sont pas des exceptions > La Conception de GUI est une tâche visuelle. Utilisez un visual builder > Si vous ne pouvez pas (ou ne voulez pas) utiliser un visual builder, utiliser un non-visual builder. Mais utilisez un outil! > Si vous ne pouvez pas utiliser un outil, allez cher de la caféine– cela risque d’être une
Préférez-vous voir ceci. . . private void build() { Form. Layout form. Layout = new Form. Layout( "f: d: n, l: 7 dlu: n, f: d: g", // columns "c: d: n, t: 4 dlu: n, c: d: n, t: 7 dlu: n, f: d: g, t: 7 dlu: n, c: d: n"); // rows Panel. Builder builder = new Panel. Builder(this, form. Layout); builder. set. Default. Dialog. Border(); Cell. Constraints cc = new Cell. Constraints(); Cell. Constraints cl = new Cell. Constraints(); builder. add. Label("Links: ", cl. xywh(1, 1, 1, 1), text. Only. Hyperlink, cc. xywh(1, 3, 1, 1)); builder. add. Label("Link Content: ", cl. xywh(3, 1, 1, 1), new JScroll. Pane(link. Visitor. get. Output. Component()), cc. xywh(3, 5)); } builder. add(new JScroll. Pane(table), cc. xywh(1, 5, 1, 1) ); builder. add(new JScroll. Pane(list), cc. xywh(1, 7, 1, 1)); 3, 1,
. . . Ou ceci?
DEMO Joplin: Build a Music Player with Netbeans
Q&A romain. guy@mac. com