Desktop Intégration. Rémi Forax



Documents pareils
Développement Logiciel

Java 7 Les fondamentaux du langage Java

Cahier des Charges du Projet Domotique. Choquet Mathieu Masson Jérôme Groupe 6. Domotique. p.1

Déployer les Fonts, Icones, et Images avec Forms Services 11G

Synchro et Threads Java TM

Un ordonnanceur stupide

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Corrigé des exercices sur les références

Interfaces graphiques avec l API Swing

ACTIVITÉ DE PROGRAMMATION

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Remote Method Invocation Les classes implémentant Serializable

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Calcul Parallèle. Cours 5 - JAVA RMI

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Introduction au langage Java

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Threads. Threads. USTL routier 1

Auto-évaluation Programmation en Java

Computer Link Software

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Programmer en JAVA. par Tama

Projet de programmation (IK3) : TP n 1 Correction

Asset Management Software Client Module. Manuel d utilisation

Présentation des PowerToy pour Windows XP

Programmation Par Objets

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Java Licence professionnelle CISII,

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Construire des plug-ins pour SAS Management Console SAS 9.1

Utilisation du logiciel Epson Easy Interactive Tools

Flux de données Lecture/Ecriture Fichiers

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

IFT287 Exploitation de base de données relationnelles et orientées objet. Laboratoire Mon premier programme Java en Eclipse

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Utilisation de XnView

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Silhouette Studio Leçon N 2

Package Java.util Classe générique

Applet pour visualiser les variables «automate» notifiées

Notion de thread (1/2)

Annexe 10 - Procédure pour créer un Jar

Introduction : les processus. Introduction : les threads. Plan

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Dis papa, c est quoi un bus logiciel réparti?

Fonctionnement général de Tiny ERP

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

La base de données XML exist. A. Belaïd

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

RMI le langage Java XII-1 JMF

Java Licence Professionnelle CISII,

VM Card. Manuel des paramètres des fonctions étendues pour le Web. Manuel utilisateur

Espace Client Aide au démarrage

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Système Normalisé de Gestion des Bibliothèques -SYNGEB : version Réseau-

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Notes de cours Practical BigData

Application de lecture de carte SESAM-Vitale Jeebop

Traitement par lot redimensionner des images

7 Développement d une application de MapReduce

Aide à la clé pédagogique «Former à la première intervention et à l évacuation»» 2 e édition

SOMMAIRE. Présentation assistée sur ordinateur. Collège F.Rabelais 1/10

4. Groupement d objets

Le Modèle de Sécurité dans JAVA

Capture Pro Software. Démarrage. A-61640_fr

TP1 : Initiation à Java et Eclipse

GUIDE D UTILISATION. Gestion de compte. à destination des entreprises (Employeurs et Organismes de Formation)

Accès au Serveur de PAIE «SPV» par INTERNET Paramétrage du poste de travail «Windows»

OPPassessment Guide d utilisateur

MEMENTO D'UTILISATION Du T.N.I. SmartBoard (Version )

Quelques outils pour le logiciel «Tux Paint»

INITIATION AU LANGAGE JAVA

JAVA 8. JAVA 8 - Les fondamentaux du langage. Les fondamentaux du langage Java. Avec exercices pratiques et corrigés JAVA 8 29,90.

Création d un service web avec NetBeans 5.5 et SJAS 9

OpenPaaS Le réseau social d'entreprise

Prise en main du logiciel Smart BOARD

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

2X ThinClientServer Guide d utilisation

C RÉATION DE PDF (1) Cours SEM 205 Mieux utiliser le format PDF

Java 1.5 : principales nouveautés

Quelques outils pour le logiciel «Tuxpaint»

Premiers Pas en Programmation Objet : les Classes et les Objets

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

2010 Ing. Punzenberger COPA-DATA GmbH. Tous droits réservés.

Principe de fonctionnement du lanceur d'application "AdisTlsStartCfgLotus"

Middleware eid v2.6 pour Windows

Comment sauvegarder ses documents

LES BIBLIOTHEQUES DE WINDOWS 7

SimpleOCR, un logiciel gratuit de reconnaissance de caractères

Publication Assistée par Ordinateur

AVerMedia CM3000 Manuel d utilisation

Tp 1 correction. Structures de données (IF2)

Comment réaliser une capture d écran dans Word. Alors comment ouvrir une page Word?

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

Transcription:

Desktop Intégration Rémi Forax 1

Intégration au bureau L intégration de l application au bureau de l utilisateur se fait en combinant plusieurs techniques L écran d annonce de l application (SplashScreen) Définition des Icônes de l'application Le contrôle des icônes dans la zone de notification (SystemTray) La possibilité de demander au bureau d ouvrir un fichier avec l application par défaut, de visualiser un fichier dans le browser web, etc. (Desktop) La possibilité de prendre le contrôle du bureau pour générer de faux évènements souris/clavier ou faire des copies d écrans (Robot) 2

SplashScreen Il est possible de spécifier une image de démarrage de l'application Cette image est chargée avant toutes les classes de la machine virtuelle java -splash:splash.jpg fr.umlv.ui.splash.splashtest 3

SplashScreen & Jar Il est possible de spécifier le splash screen dans le manifest d'un fichier jar Manifest-Version: 1.0 Main-Class: Test SplashScreen-Image: splash.jpg Le splash screen est alors affiché lors de l'exécution du jar java -jar splash-test.jar 4

SplashScreen Pour obtenir le splash screen, on utilise la method factory SplashScreen.getSplashScreen(); Le splash screen disparaît : Lors de l'affichage de la première fenêtre frame.setvisible(true); Lors d'un appel explicite à close() public static void main(string[] args) throws InterruptedException { final SplashScreen splash=splashscreen.getsplashscreen(); Thread.sleep(1000); splash.close(); 5

Mise à jour dynamique Il est possible de dessiner sur le splash screen La méthode Graphics creategraphics() renvoie le context graphique correspondant à une image transparente par dessus l'image utilisée pour le splash screen Il faut alors après les modification effectuées demander la mise à jour de l'image transparent avec la méthode update() 6

Mise à jour dynamique private static Image loadimage(string filename) { return new ImageIcon(SplashTest.class.getResource(filename)).getImage(); public static void main(string[] args) throws InterruptedException { final SplashScreen splash=splashscreen.getsplashscreen(); Image[] images=new Image[]{ loadimage("home.png"), loadimage("mona.png"), loadimage("stop.png") ; Graphics2D graphics=splash.creategraphics(); int baseline=splash.getsize().height-70; for(int i=0;i<images.length;i++) { // chargement du module i graphics.drawimage(images[i],20+i*70,baseline,48,48,null); splash.update(); graphics.dispose(); splash.close(); 7

Utiliser une barre de progression On souhaite afficher une barre de progression sur le splash screen Il n'est pas possible de faire un add() d'un JProgressBar car le splash screen n'est pas un container Il faut demander l'affichage du JProgressBar directement dans le graphics de l'image transparente située au dessus du splash screen 8

Utiliser une barre de progression Pour afficher la barre de progression au bonne endroit, il faut translater le graphics. Un composants se dessine toujours en 0,0 public static void main(string[] args) throws InterruptedException { final SplashScreen splash=splashscreen.getsplashscreen(); Dimension size=splash.getsize(); JProgressBar bar=new JProgressBar(0,100); bar.setopaque(true); bar.setsize(size.width-20,bar.getpreferredsize().height); bar.setvisible(true); Graphics2D graphics=splash.creategraphics(); graphics.translate(10, size.height-30); for(int i=0;i<100;i++) { bar.setvalue(i); bar.paint(graphics); splash.update(); Thread.sleep(100); graphics.dispose(); splash.close(); 9

Icônes de l'application Une application possède différents icônes : Icône de la fenêtre Icône de l'application réduite Icône dans la barre des tâches Icône lors du changement d'application (ALT-TAB) etc. Ces icônes ont des tailles différentes dépendant de la plateforme 10

Icônes de l'application Permet de spécifier une liste d'icônes window.seticonimages(list<? extends Image> icons) Java choisi alors l'icône le plus adapté en fonction du contexte et de la taille demandée par l'os. public static void main(string[] args) { Image icon16_16=new ImageIcon( IconsFrame.class.getResource("stop16x16.gif")).getImage(); Image icon32_32=new ImageIcon( IconsFrame.class.getResource("stop32x32.gif")).getImage(); Image icon48_48=new ImageIcon( IconsFrame.class.getResource("stop48x48.png")).getImage(); JFrame frame=new JFrame(); frame.seticonimages(arrays.aslist(icon16_16,icon32_32,icon48_48)); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setsize(400,300); frame.setvisible(true); 11

System Tray java.awt.systemtray contrôle la zone de notification de la barre des tâches Le bureau possède une zone de notification supporté boolean SystemTray.isSupported() Obtenir la zone de notification (singleton) : SystemTray SystemTray.getSystemTray() 12

System Tray L'application peut alors gérer les icônes de la zone de notification Ajouter/retirer des icônes add/removetrayicon(trayicon) Obtenir les icônes présents TrayIcon[] gettrayicons() Il est possible de connaître la taille des icônes Taille en pixels des icônes Dimension gettrayiconsize() 13

System Tray La classe SystemTray possède un mécanisme générique de listener pour être averti des changements Enregistrer/Dé-enregistrer un listener add/removepropertychangelistener(string propertyname, PropertyChangeListener listener) Obtenir les listeners PropertyChangeListener[] getpropertychangelisteners(string propertyname) ajouts ou suppressions d'icônes (propriété: "trayicons") 14

Tray Icon Un icône de la zone de notification est représentée par la classe java.awt.trayicon TrayIcon(image,tooltip,popup) Une image (java.awt.image) Un tooltip (String), Un popup menu (PopupMenu) Il est possible de demander un redimensionnement automatique de l'image get/setimageautosize(boolean) 15

Tray Icon Il est possible d'afficher des messages (balloon message) pour notifier l'utilisateur void displaymessage(string caption, String text, TrayIcon.MessageType messagetype) Les types de messages sont : message simple : NONE message d'information : INFO message d'attention : WARNING message d'erreur : ERROR 16

Tray Icon Un icône de la zone de notification possède trois types de listeners La sélection de l'icône par la souris ou le clavier add/removeactionlistener() Les évènements souris add/removemouselistener() Les évènements souris impliquant un déplacement add/removemousemotionlistener() 17

Test accessibilité d'une machine Enregistrer une application dans la zone de notification qui indique si une machine est atteignable public static void main(string[] args) throws AWTException { final SystemTray tray=systemtray.getsystemtray(); Dimension traysize=tray.gettrayiconsize(); final Image trayok=loadimage("tray_ok.gif",traysize); final Image trayerror=loadimage("tray_error.gif",traysize); String tooltip=... PopupMenu popup=new PopupMenu(); final TrayIcon trayicon=new TrayIcon(trayError,tooltip,popup); tray.add(trayicon); final ReachableTester tester=new ReachableTester(...); MenuItem conf=new MenuItem("Configuration..."); conf.addactionlistener(new ActionListener() {... ); popup.add(conf); MenuItem exit=new MenuItem("Exit");... popup.add(exit); 18

Testeur d'accessibilité Le testeur d'existence utilise InetAdress.isReachable() Un scheduledexecutorservice permet d'effectuer le test périodiquement private interface ReachableListener { public void hostunreachable(inetaddress address); public void hostreachable(inetaddress address); private static class ReachableTester { public ReachableTester(InetAddress address,reachablelistener listener) { this.address=address; this.listener=listener; service=executors.newsinglethreadscheduledexecutor(); service.schedulewithfixeddelay(runnable,3,3,timeunit.seconds); public void shutdownnow() { service.shutdownnow(); public void setaddress(inetaddress address) { this.address = address; private final Runnable runnable=new Runnable() {... ; volatile InetAddress address; final ReachableListener listener; private final ScheduledExecutorService service; 19

Testeur d'accessibilité (suite) private static class ReachableTester {... private final Runnable runnable=new Runnable() { public void run() { // volatile read InetAddress address=reachabletester.this.address; boolean isreachable=false; if (address!=null) { try { isreachable=address.isreachable(3000); catch(ioexception e) { // do nothing, isreachable==false if (isreachable!=this.isreachable) { if (isreachable) listener.hostreachable(address); else listener.hostunreachable(address); this.isreachable=isreachable; private boolean isreachable=false; ; volatile InetAddress address; final ReachableListener listener; private final ScheduledExecutorService service; 20

Testeur d'accessibilité (suite) String tooltip; InetAddress address; try { address = InetAddress.getByName("gaspard.univ-mlv.fr"); tooltip="host: "+address.gethostname(); catch (UnknownHostException e) { address=null; tooltip="unknown host"; PopupMenu popup=new PopupMenu(); final TrayIcon trayicon=new TrayIcon(trayError,tooltip,popup); tray.add(trayicon); final ReachableTester tester=new ReachableTester(address, new ReachableListener() { public void hostreachable(inetaddress address) { trayicon.setimage(trayok); trayicon.displaymessage("host reachable", address.gethostname()+" is reachable",messagetype.info); public void hostunreachable(inetaddress address) { trayicon.setimage(trayerror); trayicon.displaymessage("host unreachable", address.gethostname()+" is unreachable",messagetype.error); ); 21

Testeur d'accessibilité (fin) MenuItem conf=new MenuItem("Configuration..."); conf.addactionlistener(new ActionListener() { public void actionperformed(actionevent event) { String host=joptionpane.showinputdialog(null,"enter the host name"); if (host==null) return; try { InetAddress address=inetaddress.getbyname(host); tester.setaddress(address); trayicon.settooltip("host: "+address.gethostname()); catch (UnknownHostException e) { JOptionPane.showMessageDialog(null,e.getMessage(), "Unknown host",joptionpane.error_message); ); popup.add(conf); MenuItem exit=new MenuItem("Exit"); exit.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { tray.remove(trayicon); tester.shutdownnow(); ); popup.add(exit); 22

Bureau java.awt.desktop permet de : demander pour une fichier d exécuter l application par défaut pour des actions prédéfinies (OPEN,EDIT ou PRINT) De demander au browser par défaut d afficher une URI De demander au mailer par défaut de composer un mail Les actions sont définies par l énumération Desktop.Action : OPEN, EDIT, PRINT, BROWSE, MAIL. 23

Bureau Permet de savoir si un objet Desktop existe : boolean Desktop.isDesktopSupported() Pour obtenir le bureau, il faut utiliser la factory : Desktop.getDesktop() 24

Bureau Opérations sur les fichiers utilisant l application par défaut : Ouvrir un fichier : open(file file) Editer un fichier : edit(file file) Afficher un fichier : print(file file) Opération sur des applications particulières : Ouvrir une URI avec le browser : browse(uri uri) Ouvrir une fenêtre de composition de mail : mail(uri uri) avec un URI de la forme : mailto:remi@forax.org?subject=hello&body=mailworld (les champs possibles sont "to", "cc", "subject", "body" ) 25

Exemple final JList list=new JList(new FileListModel(new File("."))); list.setcellrenderer(...); Desktop desktop=desktop.getdesktop(); Desktop.Action[] desktopactions={open,edit,print,browse; Action[] actions=new Action[desktopActions.length]; final ArrayList<Action> supportedactions=new ArrayList<Action>(); for(int i=0;i<desktopactions.length;i++) { Desktop.Action desktopaction=desktopactions[i]; Action action=createaction(list,desktop,desktopaction); action.setenabled(false); if (desktop.issupported(desktopaction)) supportedactions.add(action); actions[i]=action; list.getselectionmodel().addlistselectionlistener( new ListSelectionListener() { public void valuechanged(listselectionevent e) { boolean selected=list.getselectedindex()!=-1; for(action action:supportedactions) action.setenabled(selected); ); JPopupMenu popup=new JPopupMenu(); for(action action:actions) popup.add(action); list.setcomponentpopupmenu(popup); 26

Exemple private static Action createaction(final JList list, final Desktop desktop,final Desktop.Action desktopaction) { final String name=desktopaction.name().tolowercase(); return new AbstractAction(name) { public void actionperformed(actionevent event) { loop: for(object value:list.getselectedvalues()) { File file; try { file = ((File)value).getCanonicalFile(); switch(desktopaction) { case OPEN: desktop.open(file); continue loop; case EDIT: desktop.edit(file); continue loop; case PRINT: desktop.print(file); continue loop; case BROWSE: desktop.browse(file.touri()); continue loop; default: throw new AssertionError("invalid desktop action "+desktopaction); catch (IOException e) { e.printstacktrace(); ; 27

Robot La classe java.awt.robot permet de prendre le contrôle du bureau pour : Récupérer une image du bureau Envoyer des évènements de façon programmé Le robot à deux utilisations principales : Prendre le contrôle d un terminal graphique à distance Tester de façon automatique les interfaces graphiques 28

Gestion du robot Créer une capture d écran : BufferedImage createscreencapture(rectangle rect) Fixer le delay entre deux évènements : get/setautodelay(int milliseconds) Demande d attendre un certain délai : delay(int milliseconds) Indique d attendre après chaque commande que l ensemble des évènements soit traité : get/setautowaitforidle(boolean onoff) 29

Evènements générables Génération d évènement : Déplacement de souris : mousemove(int x,int y) Boutons de la souris : mousepress(int buttons), mouserelease(int buttons) Molette de la souris : mousewheel(int wheelamt) Touche clavier : keypress(int keycode), keyrelease(int keycode) 30

Exemple On enregistre l application dans le system tray, un double-clique effectue une copie d écran final SystemTray tray=systemtray.getsystemtray(); Image camera=new ImageIcon( Snapshot.class.getResource("camera.jpg")).getImage(); PopupMenu popup=new PopupMenu(); final TrayIcon trayicon=new TrayIcon(camera,"Snapshot",popup); trayicon.setimageautosize(true); trayicon.addactionlistener(new ActionListener() { public void actionperformed(actionevent event) {... ); tray.add(trayicon); MenuItem exit=new MenuItem("Exit"); exit.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { tray.remove(trayicon); System.exit(0); ); 31

Exemple On calcule la taille de l écran, on fait une copie, puis on récupère l'ensemble des suffixes d'images connues (png, jpg etc.) et l'on ouvre un filechooser GraphicsEnvironment env=graphicsenvironment.getlocalgraphicsenvironment(); Rectangle rect=env.getdefaultscreendevice(). getdefaultconfiguration().getbounds(); BufferedImage image; try { image=new Robot().createScreenCapture(rect); catch (AWTException e) { JOptionPane.showMessageDialog(null,e.getMessage(), e.getclass().getname(),joptionpane.error_message); return; JFileChooser chooser=new JFileChooser(); chooser.setmultiselectionenabled(false); String[] suffixes=imageio.getreaderfilesuffixes(); FileNameExtensionFilter filter=new FileNameExtensionFilter( "Images "+Arrays.toString(suffixes),suffixes); chooser.setfilefilter(filter); chooser.showsavedialog(null); 32

Exemple On utilise un JFileChooser pour demander à l utilisateur où sauver l image et suivant quel format. Le format est choisi parmi les formats reconnu par ImageIO 33

Exemple ImageIO sauvegarde dans le format suivant l extension... chooser.showsavedialog(null); File file=chooser.getselectedfile(); if (file==null) return; );... ImageWriter writer=imageio.getimagewritersbysuffix( getsuffix(file)).next(); try { writer.setoutput(imageio.createimageoutputstream(file)); writer.write(image); catch (IOException e) { JOptionPane.showMessageDialog(null,e.getMessage(), e.getclass().getname(),joptionpane.error_message); static String getsuffix(file file) { String filename=file.getname(); int index=filename.lastindexof('.'); if (index==-1) return ""; return filename.substring(index+1); 34