Cours Java - La page de Michel GRIMALDI
Transcription
Cours Java - La page de Michel GRIMALDI
LANGAGE JAVATM Michel GRIMALDI Licence Paternité - Pas d'Utilisation Commerciale Vous êtes libres : * de reproduire, distribuer et communiquer cette création au public * de modifier cette création, selon les conditions suivantes : Paternité. Vous devez citer le nom de l'auteur original. Pas d'Utilisation Commerciale. Vous n'avez pas le droit d'utiliser cette création à des fins commerciales. Partage des Conditions Initiales à l'Identique. Si vous modifiez, transformez ou adaptez cette création, vous n'avez le droit de distribuer la création qui en résulte qu'à condition de citer l'auteur. Qu’est-ce que Java? Java™ est avant tout un langage de programmation inventé en 1991 par James Gosling chez Sun Microsystems Disponible au public depuis 1995 Son succès original vient de l’inclusion d’une machine virtuelle (VM) dans le navigateur Internet de Netscape® Pour inclure des “applets” sur des pages HTML Java a largement dépassé son concept d’origine Caractéristiques Principales de Java Le terme “Java” se réfère au langage La “technologie Java” inclut le langage, l’environnement d’exécution (JRE), les kits de développement (JDK or J2SDK), les APIs, etc. Ses caractéristiques principales sont: Totalement orienté objet Totalement indépendant de la plate-forme “Write Once, Run Anywhere : écrire une fois, exécuter partout” Quelques chiffres* 97 % des bureaux d'entreprise exécutent Java 89 % des bureaux (ou ordinateurs) des Etats-Unis exécutent Java 9 millions de développeurs Java dans le monde Choix n° 1 des développeurs Plate-forme de développement n° 1 3 milliards de téléphones mobiles exécutent Java 100 % des lecteurs Blu-ray livrés avec Java 5 milliards de cartes Java utilisées 125 millions de périphériques TV exécutent Java Les 5 fabricants d'équipement d'origine principaux fournissent Java ME * https://www.java.com/fr/about/ Les éditions Java 2 Java SE anciennement J2SE : Java Standard Edition Développement d’applications (d’applets) côté terminal Java EE anciennement J2EE et JavaONE J2SE + Développement d’applications côté serveur (servlets/JSP, portlets, applets, EJB, JMS, XA, SOAP…) Java ME : Java Micro Edition 2 configurations de machine CDC : JVM CLDC : KVM EmbeddedJava JVM + tout package est optionnel PersonalJava (pJava) JVM + nombre réduit de packages (devenu un profile de CDC) SavaJe XE J2SE + OS pour des PDA Haut de Gamme http://www.savaje.com/ JavaCard JCVM + packages propre à JavaCard Java Standard Edition Java SE (Java Standard Edition) est le framework Java destiné aux applications pour poste de travail. Ce framework contient toutes les API de base, mais également toutes les API spécialisées dans le poste client : JFC (Java Foundation Classes), et donc Swing, AWT et Java2D (Java 2D Graphics API ), ainsi que des API d'usage général comme JAXP (pour le parsing XML) et JDBC (pour la gestion des bases de données). XML <!-- Edited by XMLSpy® --> − <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend! </body> </note> Java Micro Edition Java ME (Java Micro Edition) est le framework Java spécialisé dans les applications mobiles. Des plates-formes Java compatibles avec Java ME sont embarquées dans de nombreux téléphones portables et PDA. Une plate-forme Java ME est composée : • d'une KVM (Kilobyte Virtual Machine), une machine virtuelle capable d'exécuter une application Java • d'une « configuration », une API donnant accès aux fonctions de base du système • d'un « profil », une API donnant accès aux fonctions spécifiques de la plate-forme. Les configurations les plus courantes sont : • CLDC (Connected Limited Device Configuration), que l'on retrouve par exemple dans les téléphones mobiles • CDC (Connected Device Configuration), qui est plutôt utilisé dans des décodeurs de télévision numérique Les profils les plus courants sont : • MIDP (Mobile Information Device Profile), dont sont équipés les téléphones WAP J2ME • DoJa, développé par NTT DoCoMo pour les téléphones i-mode J2ME JAVA embarqué Carte à puce (SmartCard ) Téléphone mobile (Cellular Phone) PalmPC, PocketPC, Assistant Personnel Cartable Electronique (eBook) Appareil photo, … Decodeur TV Numérique (Set Top Box) Console de jeu (Game Console) Electronique consomable (Electronic Consuming) Terminal de paiement, Guichet, Parcmètre Portail maison, domotique Autmobile Wearable computer (Augmented Reality) Prothèse active Satellite ... Java et Android Android est un système d'exploitation pour téléphone portable de nouvelle génération développé par Google. Android n'est pas totalement conforme à JAVA car Google n’utilise pas la machine virtuelle Java (JVM) Google a créé pour Android sa propre machine virtuelle, la Dalvik Virtual Machine (DVM). Celui-ci met à disposition un kit de développement (SDK) basé sur le langage Java. Plateforme android Smartphones : Android atteint 82 % de parts du marché mondial « Gartner Inc. Octobre 2013» Vers plus d’un milliard de terminaux Android en 2014 Eléments du langage JavaTM Platform Java – langage orienté objet La programmation orientée objet consiste à modéliser informatiquement un ensemble d'éléments d'une partie du monde réel (que l'on appelle domaine) en un ensemble d'entités informatiques. Ces entités informatiques sont appelées objets. Ces derniers regroupent es principales caractéristiques des éléments du monde réel (taille, couleur, …) et leur comportement. L'approche objet est basée sur trois notions : – L'encapsulation – L'héritage – Le polymorphisme Les types de données primitifs Types primitifs de JAVA (primitives) Primitive Signification Taille (en octets) Plage de valeurs acceptée char Caractère 2 valeur du jeu de caractères Unicode (65000 caractères possibles) byte Entier très court 1 -128 à 127 short Entier court 2 -32768 à 32767 int Entier 4 -2 147 483 648 à 2 147 483 647 long Entier long 8 -9223372036854775808 à 9223372036854775807 float flottant (réel) 4 -1.4*10-45 à 3.4*1038 double flottant double 8 4.9*10-324 à 1.7*10308 boolean booléen 1 0 ou 1 (en réalité, toute autre valeur que 0 est considérée égale à 1) Attributs, variables, constantes, tableaux… // déclaration de variable int x; float u, v ; char c = ‘A’; float toto = 125.36f; final float pi = 3.14159 ; // tableau int monTableau[ ] = new int[10]; // ou : int [ ] monTableau = new int[10]; //initialisation tableau int [] autreTableau = {2,3,5,7,11,0,17}; int nb; autreTableau[5] = 23; // 2 3 5 7 11 23 17 nb = monTableau[4]; // nb=11 tableaux // tableau à 2 dimensions // ex : (matrice 5 lignes x 6 colonnes) int[][] matrice=new int[5][]; for (int i=0 ; i<matrice.length1; i++) matrice[i]=new int[6]; // autre dimension int[][] matrice2 = { { 0, 1, 4, 3 } , { 5, 7, 9, 11, 13, 15, 17 } }; int i, j; for(i=0; i<matrice2.length1; i++) { for(j=0; j<matrice2[i].length1; j++) { //Action sur matrice2[i][j] } } Length donne le nombre d'éléments du tableau Opérateurs Opérateurs de calcul Opérateur Dénomination Effet Exemple Résultat (avec x valant 7) + opérateur d'addition Ajoute deux valeurs x+3 10 - opérateur de soustraction Soustrait deux valeurs x-3 4 * opérateur de multiplication Multiplie deux valeurs x*3 21 / plus: opérateur de division Divise deux valeurs x/3 2.3333333 = opérateur d'affectation Affecte une valeur à une variable x=3 Met la valeur 3 dans la variable x Opérateur Opérateurs d’assignation Effet += addition deux valeurs et stocke le résultat dans la variable (à gauche) -= soustrait deux valeurs et stocke le résultat dans la variable *= multiplie deux valeurs et stocke le résultat dans la variable /= divise deux valeurs et stocke le résultat dans la variable Opérateurs d’incrémentation Opérateur Dénomination Effet Syntaxe Résultat (avec x valant 7) ++ Incrémentation Augmente d'une unité la variable x++ 8 -- Décrémentation Diminue d'une unité la variable x-- 6 Opérateurs … Opérateur Opérateurs de Comparaison Opérateurs logiques Dénomination Effet Exemple == A ne pas confondre avec le signe d'affectation (=)!! opérateur d'égalité Compare deux valeurs et vérifie leur égalité x==3 < opérateur d'infériorité stricte Vérifie qu'une variable est strictement inférieure à une valeur x<3 <= opérateur d'infériorité Vérifie qu'une variable est inférieure ou égale à une valeur x<=3 > opérateur de supériorité stricte Vérifie qu'une variable est strictement supérieure à une valeur x>3 >= opérateur de supériorité Vérifie qu'une variable est supérieure ou égale à une valeur x>=3 != opérateur de différence Vérifie qu'une variable est différente d'une valeur x!=3 Opérateur Dénomination Effet || OU logique Vérifie qu'une des conditions est réalisée && ET logique Vérifie que toutes les conditions sont réalisées ! NON logique Inverse l'état d'une variable booléenne (retourne la valeur True si la variable vaut False, False si elle vaut True) Opérateurs bits à bits Opérateurs de rotation de bits Opérateu r & Dénominatio n ET bit-à-bit 9 & 12 (1001 & 1100) | OU inclusif 9 | 12 (1001 | 1100) ^ OU exclusif 9 ^ 12 (1001 ^ 1100) Dénomination Syntaxe Syntaxe Opérateu r << Rotation à gauche 6 << 1 (110 << 1) >> Rotation à droite avec conservation du signe 6 >> 1 (0110 >> 1) >>> Rotation à droite avec remplissage de zéros 3 >>> 1 (0011 >>> 1) Les enveloppeurs (wrappers) Enveloppeur Primitive associée BigDecimal aucune primitive associée, car cette classe peut contenir des valeurs décimales de précision quelconque BigInteger aucune primitive associée, car cette classe peut contenir des valeurs entières de précision quelconque Character char Byte byte Short short Integer int Long long Float float Double double Boolean boolean Void void Exemple : la class Double java.lang.Object Héritée en java.lang.Number Hérité en java.lang.Double La classe Double encapsule une valeur du type primitif double sous la forme d'un objet. La classe offre plusieurs méthodes pour les conversions double/String, String/double, et d'autres facilités Constructeurs : Double(double value) Double(String s) Les instructions … • Lorsque l'on veut regrouper plusieurs instructions, on peut créer un bloc, c'est-à-dire un ensemble d'instructions comprises entre les accolades { et }. • • • • • • • L'instruction if et if ... else … Opérateur ternaire (condition) ? instruction si vrai : instruction si faux L'instruction switch … case… L'instruction for L'instruction while Saut inconditionnel: continue Arrêt inconditionnel: break Exceptions La gestion des exceptions avec Java consiste à définir au sein d'une méthode une clause "try{}" contenant les instructions qui risquent de provoquer une exception et de la faire suivre immédiatement par une clause "catch(){}" contenant comme paramètre l'exception attendue précédée de son type et dont le contenu sera une liste d'instructions à exécuter lorsque l'exception se produira. classNom_de_la_classe Nom_de_la_classe{ { class publicstatic staticvoid voidmain(String[] main(String[]args) args){ { public Instructionsinoffensives inoffensives(affectations, (affectations,...); ...); ////Instructions }} try { { try Instructionssusceptibles susceptiblesde deprovoquer provoquerdes deserreurs; erreurs; ////Instructions } }** catch(TypeException (TypeExceptione)e){ { catch Instructionsde detraitement traitementde del'erreur; l'erreur; ////Instructions }} Instructionssisiaucune aucuneerreur erreurest estapparue; apparue; ////Instructions }} * Aucune instruction ne doit se trouver entre le bloc try{} et le bloc catch{} . Les blocs try{} et catch{} peuvent chacun contenir plusieurs instructions Exceptions - exemple Double.valueOf converti une chaine en double try { try { String str = “156.78”; String str = “156.78”; String str2; String str2; double valeur = Double.valueOf(str); double valeur = Double.valueOf(str); valeur = valeur/tauxChangeEuroDollar; valeur = valeur/tauxChangeEuroDollar; str2 = String.valueOf(valeur); str2 = String.valueOf(valeur); } catch (NumberFormatException nx) { } catch (NumberFormatException nx) { System.out.println("Erreur de conversion"); System.out.println("Erreur de conversion"); } } java.lang Class NumberFormatException java.lang.Object extended by java.lang.Throwable extended by java.lang.Exception extended by java.lang.RuntimeException extended by java.lang.IllegalArgumentException extended by java.lang.NumberFormatException http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/NumberFormatException.html Comment obtenir JAVA http://www.oracle.com/technetwork/java/javase/downloads/ index.html C'est ce site que vous devrez toujours avoir ouvert quand vous développerez en JAVA Documentation: http://docs.oracle.com/javase/8/docs/api/index.html Java Development Kit de Sun Le compilateur compilateur javac javac Le Lasyntaxe syntaxeest estlalasuivante suivante: :javac javac[options] [options][fichiers] [fichiers][@fichiers] [@fichiers] La L'interpréteur java/javaw java/javaw L'interpréteur Cesdeux deuxoutils outilssont sontles lesinterpréteurs interpréteursde debyte bytecode code: :ils ilslancent lancentleleJRE, JRE,chargent chargentles lesclasses classesnécessaires nécessaires Ces executentlalaméthode méthodemain mainde delalaclasse. classe. etetexecutent javaouvre ouvreune uneconsole consolepour pourrecevoir recevoirles lesmessages messagesde del'application l'applicationalors alorsque quejavaw javawn'en n'enouvre ouvrepas. pas. java L'outil JAR JAR L'outil JAR est est lelediminutif diminutifde deJava JavaARchive. ARchive.C'est C'estun unformat format de defichier fichierqui quipermet permetde deregrouper regrouperdes desfichiers fichiers JAR contenantdu dubyte-code byte-codeJava Java(fichier (fichier.class) .class)ou oudes desdonnées donnéesutilisées utiliséesen entemps tempsque queressources ressources(images, (images, contenant son,...). ...).Ce Ceformat formatest estcompatible compatibleavec avecleleformat formatZIP ZIP: :les lesfichiers fichierscontenus contenusdans dansun unjar jarsont sontcompressés compressés son, defaçon façonindépendante indépendantedu dusystème systèmed'exploitation. d'exploitation. de Pour tester tester les les applets applets :: l'outil l'outil appletviewer appletviewer Pour Cetoutil outilpermet permetde detester testerune uneapplet. applet.L'intérêt L'intérêtde decet cetoutil outilest estqu'il qu'ilpermet permetde detester testerune uneapplet appletavec aveclala Cet version courante courante du du JDK. JDK. Un Un navigateur navigateur classique classique nécessite nécessite un un plug-in plug-in pour pour utiliser utiliser une une version version version particulièredu duJRE. JRE. particulière Pour générer générer lala documentation documentation :: l'outil l'outil javadoc javadoc Pour Cetoutil outilpermet permetde degénérer générerune unedocumentation documentationààpartir partirdes desdonnées donnéesinsérées inséréesdans danslelecode codesource. source. Cet Code JAVA. Dans le cadre de ce cours nous n'aborderons que des programmes représentant: Des applications consoles Des applications graphiques Des applets Applications Android http://www.javacoffeebreak.com/ Application console JAVA grimaldi@grimaldidesktopGEII: cat MainClass.java public class MainClass { public static void main (String[] args){ int i; for (i = 0 ; i<10 ; i++) System.out.println("Hello World"); } } grimaldi@grimaldidesktopGEII: javac MainClass.java // une application HelloWorld en console grimaldi@grimaldidesktopGEII: java MainClass public class MainClass { Hello World Hello Worldpublic static void main (String[] args){ Hello World int i; Hello World for (i = 0 ; i<10 ; i++) Hello World System.out.println("Hello World"); Hello World } Hello World Hello World } Hello World Hello World Exécution du code JAVA Erreurs… public class MainClass { public static void main (String[] args){ int i; for (i = 0 ; i<10 ; i++) System.out.println("Hello World"); } Pas d’erreurs… Compilateur JAVA 1001 1101 1110 1101 0011 0110 0000 0001 … Byte code } Code source Toto.class Toto.java Machine virtuelle (JVM) Hello World Hello World Hello World … Paramètres de la ligne de commande public class Exo1 { public static void main(String[] args) { if (args.length<1){ System.out.println("vous devez spécifier au moins un paramètre."); return; } System.out.print("Bonjour "); for (int i=0 ; i<args.length ; i++){ System.out.print(args[i]); System.out.print(' '); } System.out.println(); } } >javac Exo1.java >java Exo1 aa bbb hhh ttt Bonjour aa bbb hhh ttt >java Exo1 vous devez spécifier au moins un paramètre. exercice Calcul du factoriel d'un nombre entré sur la ligne de commande int Integer.parseInt(String); public class Factoriel { public static void main(String[] arg) { int n, factorielle = 1 ; if (arg.length!=1) { System.out.println("usage: java Factoriel nbre."); return; } n = Integer.parseInt(arg[0]); for (int i = 2; i <= n; i++) factorielle *= i; System.out.println("la factorielle de " + n + " = " + factorielle); } } >javac Factoriel.java >java Factoriel usage: java Factoriel nbre. >java Factoriel 5 la factorielle de 5 = 120 >java Factoriel k Exception in thread "main" java.lang.NumberFormatException: For input string: "k" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:492) at java.lang.Integer.parseInt(Integer.java:527) at Factoriel.main(Factoriel.java:9) exercice Calcul du factoriel d'un nombre entré sur la ligne de commande avec vérification paramètre. try … catch() public class Factoriel { public static void main(String[] arg) { int n, factorielle = 1 ; if (arg.length!=1) { System.out.println("usage: java Factoriel nbre."); return; } try{ n = Integer.parseInt(arg[0]); } catch(NumberFormatException ex){ System.out.println("le paramètre doit être un nombre entier!"); return; } for (int i = 2; i <= n; i++) factorielle *= i; System.out.println("la factorielle de " + n + " = " + factorielle); } } Déclaration de classes JAVA import java...... ; import java...... ; public class MaClasse extends ClasseMere { int x ; AutreClasse obj ; héritage attributs public MaClasse(){ obj = new AutreClasse() ; } constructeur public MaClasse(argument){ super(argument) ; } public static void main (String[] args){ } } class AutreClasse { … attributs … public AutreClasse(){ } … méthodes … } Classe privée Exercice : un point du plan class Point{ private int x; private int y; public Point(){ x = y = 0; } public Point(int x, int y){ this.x = x; this.y = y; } public int getX(){ return x; } public int getY(){ return y; } public void setX(int x){ this.x = x; } public void setY(int y){ this.y = y; } public void affiche(){ System.out.println("("+x+","+y+")"); } public double dist(Point p){ return Math.sqrt(Math.pow(xp.getX(), 2)+Math.pow(yp.getY(), 2) ); } } Exercice : un cercle du plan class Cercle{ private Point centre; private int r; public Cercle(){ centre = new Point(); r=1; } public Cercle(int x, int y, int r){ centre = new Point(x, y); this.r = r; } public void affiche(){ centre.affiche(); System.out.println(r); } public boolean contient(Point p){ return centre.dist(p)<=r; } } Exercice : application Point&Cercle import java.math.*; public class PointCercle { public static void main(String[] arg) { Point p1 = new Point(10, 10); Point p2 = new Point(10, 5); Cercle c = new Cercle(10, 10, 10); p2.affiche(); c.affiche(); System.out.print("p2 est à "); if (c.contient(p2))System.out.print("l'intérieur "); else System.out.print("l'extérieur "); System.out.println("du cercle!"); } }; class Point{ Comme précédemment . . . } class Cercle{ Comme précédemment . . . } >java PointCercle (10,5) (10,10) 10 p2 est à l'intérieur du cercle! > La classe String public class Toto{ public static void main(String[] args){ String str1="bonjour"; String str2="bonjour"; String str3 = new String("bonjour"); System.out.println(str1+" "+str2+" "+str3); if (str1==str2)System.out.println("1 == 2"); else System.out.println("1 != 2"); if (str1==str3)System.out.println("1 == 3"); else System.out.println("1 != 3"); if (str2==str3)System.out.println("3 == 2"); else System.out.println("3 != 2"); } } bonjour bonjour bonjour 1 == 2 1 != 3 3 != 2 La classe String public class Toto{ public static void main(String[] args){ String str1="bonjour"; String str2="bonjour"; String str3 = new String("bonjour"); if (str1==str2)System.out.println("1 == 2"); else System.out.println("1 != 2"); if (str1==str3)System.out.println("1 == 3"); else System.out.println("1 != 3"); if (str2==str3)System.out.println("3 == 2"); else System.out.println("3 != 2"); str1 = "hello"; System.out.println(str1+" "+str2+" "+str3); if (str1==str2)System.out.println("1 == 2"); else System.out.println("1 != 2"); if (str1==str3)System.out.println("1 == 3"); else System.out.println("1 != 3"); if (str2==str3)System.out.println("3 == 2"); else System.out.println("3 != 2"); } } 1 == 2 1 != 3 3 != 2 hello bonjour bonjour 1 != 2 1 != 3 3 != 2 La classe String public class Toto{ public static void main(String[] args){ String str1="bonjour"; String str2="bonjour"; String str3 = new String("bonjour"); if (str1==str2)System.out.println("1 == 2"); else System.out.println("1 != 2"); if (str1==str3)System.out.println("1 == 3"); else System.out.println("1 != 3"); if (str2==str3)System.out.println("3 == 2"); else System.out.println("3 != 2"); if (str1.equals(str2))System.out.println("1 == 2"); else System.out.println("1 != 2"); if (str1.equals(str3))System.out.println("1 == 3"); else System.out.println("1 != 3"); if (str2.equals(str3))System.out.println("3 == 2"); else System.out.println("3 != 2"); } } 1 == 2 1 != 3 3 != 2 1 == 2 1 == 3 3 == 2 La classe String concaténation String s1 = "Bonjour" ; String s2 = "le monde !" ; String s3 = s1 + " " + s2 ; Bonjour le monde ! extraction d'une sous-chaîne String s1 = "Bonjour le monde !" ; String s2 = s1.substring(8) ; // à partir du 8ème caractère String s3 = s1.substring(8, 10) ; // du 8ème au 10ème caractère le monde ! le Comparaison de chaînes public class Toto{ public static void main(String[] args){ String str1 = "[email protected]"; String str2 = "[email protected]"; System.out.println(str1.compareTo(str2)); System.out.println(str1.compareToIgnoreCase(str2)); } } 4 4 La classe String comparaisons lexicographiques public class Toto{ public static void main(String[] args){ String str1 = "[email protected]"; String str2 = "[email protected]"; String str3 = "grimaldiafree.fr"; String emailregularexp = "^[_AZaz09\\+]+(\\.[_AZaz09]+)*@[AZaz09]+(\\.[AZaz09]+)*(\\.[AZaz]{2,})$"; System.out.println(str1.startsWith("gr")); boolean isemailaddress = str1.matches(emailregularexp); boolean isemailaddress2 = str3.matches(emailregularexp); System.out.println(isemailaddress); System.out.println(isemailaddress2); } } true true false remplacement public class Toto{ public static void main(String[] args){ String str1 = "au clair de la lune mon ami Pierrot"; String str2, str3; str2 = str1.replace("e", "x"); str3 = str1.replaceFirst("e","x"); System.out.println(str2); System.out.println(str3); } } au clair dx la lunx mon ami Pixrrot au clair dx la lune mon ami Pierrot La classe String Sous chaînes public class Toto{ public static void main(String[] args){ String s = " Grimaldi;Michel;Java " ; s = s.trim() ; System.out.println(s); String[] a = s.split("\\;"); for (int i=0 ; i<a.length ; i++){ System.out.println(a[i]); } } Grimaldi;Michel;Java Grimaldi Michel Java } http://blog.paumard.org/cours/java/chap03objectstringstring.html Entrée au clavier package javaapplication7; import java.util.Scanner; import java.util.*; public class JavaApplication7 { Veuillez saisir une phrase : au clair de la lune Vous avez saisi : au clair de la lune mot 0 = au mot 1 = clair mot 2 = de mot 3 = la mot 4 = lune /** * @param args the command line arguments */ public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Veuillez saisir une phrase :"); String str = sc.nextLine(); System.out.println("Vous avez saisi : " + str); String[] arguments = str.split(" "); for (int i=0 ; i<arguments.length ; i++){ System.out.println("mot "+i+" = "+arguments[i]); } } } Application graphique import javax.swing.*; public class GraphApp { public static void main (String[] args){ JFrame fenetre = new JFrame(); fenetre.setTitle("Une application Graphique Swing"); fenetre.setSize(300,200); JLabel label = new JLabel("Hello World !"); fenetre.getContentPane().add(label); fenetre.setVisible(true); } } >ls GraphApp.java >javac GraphApp.java >ls GraphApp.class GraphApp.java >java GraphApp // une fenêtre // son titre // sa taille // un label // insertion // affichage La classe JFrame javax.swing Class JFrame java.lang.Object java.awt.Component java.awt.Container java.awt.Window java.awt.Frame javax.swing.JFrame http: acle.c r o . s //doc /docs 8 / e s ava om/j wing s / x a av /api/j tml h . e m /JFra All Implemented Interfaces: ImageObserver, MenuContainer, Serializable, Accessible, RootPaneContainer, WindowConstants public class Frame extends Window implements MenuContainer A Frame is a top-level window with a title and a border. http: //d /java m o c . racle o . s c o l .htm e m a r wt/F a / a v a api/j / s c o se/8/d The size of the frame includes any area designated for the border. The dimensions of the border area may be obtained using the getInsets method, however, since these dimensions are platform-dependent, a valid insets value cannot be obtained until the frame is made displayable by either calling pack or show. Since the border area is included in the overall size of the frame, the border effectively obscures a portion of the frame, constraining the area available for rendering and/or displaying subcomponents to the rectangle which has an upper-left corner location of (insets.left, insets.top), and has a size of width - (insets.left + insets.right) by height - (insets.top + insets.bottom). The default layout for a frame is BorderLayout. Bibliothèques / Packages JavaTM Platform Java Platform, Standard Edition Documentation en ligne http://docs.oracle.com/javase/8/docs/ (doc officielle) Utilisation directe d’une classe particulière d’un package Organisation class Exemple { static void main(String args[]){ java.shape2D.Circle c1 = new java.shape2D.Circle(); ... } } • Un package est un regroupement de classes, travaillant conjointement sur le même domaine. • Partant de cette idée les concepteurs du langage ont développé une série de packages permettant d'utiliser l'ensemble des ressources de la machine (c'est l'API de Java). • Nous pouvons utiliser des classes d'un package et créer nos propres packages Importation d’une classe ou import java.awt.Button; // On importe la classe Button de toutes les import java.shape2D.*; // On importe toutes les classes classes d’un package class Exemple { static void main(String args[]){ Circle c1 = new Circle(); ... } } Les packages … java.applet java.applet java.awt java.awt java.beans java.beans java.io java.io java.lang java.lang java.math java.math Provides Providesthe theclasses classesnecessary necessarytotocreate createananapplet appletand andthe theclasses classesananapplet appletuses usestotocommunicate communicatewith withitsitsapplet appletcontext. context. Contains Containsall allofofthe theclasses classesfor forcreating creatinguser userinterfaces interfacesand andfor forpainting paintinggraphics graphicsand andimages. images. Contains Containsclasses classesrelated relatedtotodeveloping developingbeans beans----components componentsbased basedon onthe theJavaBeansTM JavaBeansTMarchitecture. architecture. Provides for system input and output through data streams, serialization and the file system. Provides for system input and output through data streams, serialization and the file system. Provides classes that are fundamental to the design of the Java programming language. Provides classes that are fundamental to the design of the Java programming language. Provides Provides classes classes for for performing performing arbitrary-precision arbitrary-precision integer integer arithmetic arithmetic (BigInteger) (BigInteger) and and arbitrary-precision arbitrary-precision decimal decimal arithmetic arithmetic(BigDecimal). (BigDecimal). java.net Provides java.net Providesthe theclasses classesfor forimplementing implementingnetworking networkingapplications. applications. java.nio Defines buffers, which are containers for data, and provides java.nio Defines buffers, which are containers for data, and providesananoverview overviewofofthe theother otherNIO NIOpackages. packages. java.rmi Provides java.rmi Providesthe theRMI RMIpackage. package. java.security Provides java.security Providesthe theclasses classesand andinterfaces interfacesfor forthe thesecurity securityframework. framework. java.sql Provides the API for accessing and processing data stored in a data source (usually a relational database) using the java.sql Provides the API for accessing and processing data stored in a data source (usually a relational database) using the JavaTM JavaTMprogramming programminglanguage. language. java.text Provides classes and interfaces java.text Provides classes and interfacesfor forhandling handlingtext, text,dates, dates,numbers, numbers,and andmessages messagesinina amanner mannerindependent independentofofnatural natural languages. languages. java.util Contains java.util Containsthe thecollections collectionsframework, framework,legacy legacycollection collectionclasses, classes,event eventmodel, model,date dateand andtime timefacilities, facilities,internationalization, internationalization, and andmiscellaneous miscellaneousutility utilityclasses classes(a(astring stringtokenizer, tokenizer,a arandom-number random-numbergenerator, generator,and anda abit bitarray). array). javax.accessibility javax.accessibility Defines Defines a a contract contract between between user-interface user-interface components components and and anan assistive assistive technology technology that that provides provides access access toto those those components. components. javax.crypto Provides javax.crypto Providesthe theclasses classesand andinterfaces interfacesfor forcryptographic cryptographicoperations. operations. javax.imageio The main package of the Java Image I/O API. javax.imageio The main package of the Java Image I/O API. javax.management javax.managementProvides Providesthe thecore coreclasses classesfor forthe theJava JavaManagement ManagementExtensions. Extensions. javax.naming Provides the classes and interfaces for accessing naming javax.naming Provides the classes and interfaces for accessing namingservices. services. javax.net Provides javax.net Providesclasses classesfor fornetworking networkingapplications. applications. javax.print Provides javax.print Providesthe theprincipal principalclasses classesand andinterfaces interfacesfor forthe theJavaTM JavaTMPrint PrintService ServiceAPI. API. javax.rmi Contains user APIs for RMI-IIOP. javax.rmi Contains user APIs for RMI-IIOP. javax.security.auth javax.security.authThis Thispackage packageprovides providesa aframework frameworkfor forauthentication authenticationand andauthorization. authorization. javax.sound.midi Provides interfaces and classes for I/O, sequencing, and synthesis javax.sound.midi Provides interfaces and classes for I/O, sequencing, and synthesisofofMIDI MIDI(Musical (MusicalInstrument InstrumentDigital DigitalInterface) Interface)data. data. javax.sql Provides javax.sql Providesthe theAPI APIfor forserver serverside sidedata datasource sourceaccess accessand andprocessing processingfrom fromthe theJavaTM JavaTMprogramming programminglanguage. language. javax.swing Provides javax.swing Providesa aset setofof"lightweight" "lightweight"(all-Java (all-Javalanguage) language)components componentsthat, that,totothe themaximum maximumdegree degreepossible, possible,work workthe thesame sameonon all platforms. all platforms. javax.transaction javax.transaction Contains Containsthree threeexceptions exceptionsthrown thrownby bythe theORB ORBmachinery machineryduring duringunmarshalling. unmarshalling. javax.xml Defines core XML constants and functionality from the XML specifications. javax.xml Defines core XML constants and functionality from the XML specifications. Environnements de développement Editeur de texte + lignes de commande Les éditeurs simples o JCreator o Emacs o JEdit Les éditeurs avancés o Eclipse o NetBeans o IntelliJ IDEA o RAD o JDeveloper o JBuilder o BlueJ http://java.developpez.com/outils/edi/ Applets & dessin Comment créer des applets graphiques Web et Applet Lorsque l’on utilise un navigateur Web, on se connecte à un serveur Web qui renvoie des pages Web et images au navigateur. Serveur Web FichiersHTML, HTML, Fichiers images,etc. etc. images, Internet Web et Applet Serveur Web HTML, code applet Java Internet Le code d’une applet est stocké sur le serveur Web Le code de l’applet est chargée lorsque l’on accède à la page HTML qui contient (référence) l’applet Applets Avantage des applets : Les applets sont exécutées coté client. Un même programme peut être exécuté par un grand nombre d’utilisateurs, sans charger le serveur. La mise à jour du programme est facilité Inconvénients : On doit attendre que le code de l’applet soit chargé dans le navigateur avant son exécution. Le démarrage de la JVM prend du temps, la première fois 3 Applet: Hello World /** /** @(#)Essai.java ** @(#)Essai.java ** Sample Applet Applet application application ** Sample ** @author ** @author @version 1.00 1.00 07/10/17 07/10/17 ** @version */ */ <HTML> <HTML> <HEAD> <HEAD> </HEAD> </HEAD> <BODY BGCOLOR="000000"> BGCOLOR="000000"> <BODY <CENTER> <CENTER> <APPLET <APPLET import java.awt.*; java.awt.*; import import java.applet.*; import java.applet.*; code == "Essai.class" "Essai.class" code width "500" width == "500" public class class Essai Essai extends extends Applet Applet {{ public height height >> public void void init() init() {{ public } } </APPLET> </APPLET> </CENTER> </CENTER> public void void paint(Graphics paint(Graphics g) g) {{ public g.drawString("Hello world!", world!", 50, 50, 60 60 ); ); g.drawString("Hello }} } } Classes mises en œuvre ? </BODY> </BODY> </HTML> </HTML> • Essai • Applet • Graphics "300" == "300" classes mises en œuvre java.lang.Object java.lang.Object java.awt.Component java.awt.Component java.awt.Container java.awt.Container java.awt.Panel java.awt.Panel java.applet.Applet java.lang.Object java.awt.Graphics java.applet.Applet Essai Anapplet appletisisaasmall smallprogram programthat thatisisintended intendednot notto to An berun runon onits itsown, own,but butrather ratherto tobe beembedded embeddedinside inside be anotherapplication. application. another TheApplet Appletclass classmust mustbe bethe thesuperclass superclassof ofany any The applet applet TheGraphics Graphicsclass classisisthe the The abstractbase baseclass classfor forall all abstract graphicscontexts contextsthat that graphics allowan anapplication applicationto to allow drawonto ontocomponents components draw Les méthodes de Essai héritées de Applet … … voidinit() init() void voidstart() start() void voidstop() stop() void Calledby bythe thebrowser browseror orapplet appletviewer viewerto toinform inform Called thisapplet appletthat thatitithas hasbeen beenloaded loadedinto intothe the this system. system. Calledby bythe thebrowser browseror orapplet appletviewer viewerto toinform inform Called thisapplet appletthat thatititshould shouldstart startits itsexecution. execution. this Calledby bythe thebrowser browseror orapplet appletviewer viewerto toinform inform Called thisapplet appletthat thatititshould shouldstop stopits itsexecution. execution. this … … voidpaint(Graphics paint(Graphicsg) g) void … … Paintsthe thecontainer. container. Paints voidsetFont(Font setFont(Fontf)f) Sets Setsthe thefont fontof ofthis thiscontainer. container. void ColorgetBackground() getBackground() Getsthe thebackground backgroundcolor colorof ofthis thiscomponent. component. Color Gets DimensiongetSize() getSize() Returns Returnsthe thesize sizeof ofthis thiscomponent componentininthe theform formof ofaa Dimension Dimensionobject. object. Dimension … … Toutesles lesfonctionnalités fonctionnalitésde deApplet Applet (attributs (attributset etvariables) variables) Toutes + + Toutescelles cellesque queje jedéfinirai définiraiou ouredéfinirai redéfinirai moi moimême même Toutes Dessin sur l'interface utilisateur /** /** @(#)Essai.java ** @(#)Essai.java ** Sample Applet Applet application application ** Sample * * @author ** @author * @version 1.00 1.00 07/10/17 07/10/17 * @version */ */ import java.awt.*; java.awt.*; import import java.applet.*; java.applet.*; import public class class Essai Essai extends extends Applet Applet {{ public public void void init() init() {{ public }} public void void paint(Graphics paint(Graphics g) g) {{ public g.drawString("Hello world!", 50, 60 ); g.drawString("Hello world!", 50, 60 ); }} }} La classe Graphics La classe Graphics dispose de différentes fonctions de dessin : drawRect(x, y, width, height) ou drawRect(Rectangle r), permet de dessiner un rectangle Rectangle r = new Rectangle(10, 20, 50 ,70) g.drawRect(r); fillRect(x, y, width, height) pour dessiner un rectangle plein drawOval(x, y, width, height) et fillOval : dessin d’un ovale (rempli ou non) drawLine(x1, y1, x2, y2) : dessin d’un segment drawString(“Salut !”, x, y) : affichage d’une chaîne de caractère (String) setColor(couleur): modifie la couleur de tracé Gestion des couleurs La classe Color permet de choisir la couleur des formes géométriques affichées par la méthode paint : Soit g un objet de type Graphics : g.setColor(Color.red) : dessin en rouge g.setBackground(Color.black) : remplissage du fond en noir Différentes couleurs prédéfinies : Color.blue, Color.gray, Color.pink, Color.yellow, etc. On peut définir de nouvelles couleurs : Color grisClair = new Color(200, 200, 200) R Les V B 3 paramètres sont entre 0 (absence de la couleur) et 255. Le blanc est donc donné par (255, 255, 255) et le noir par (0, 0, 0) Exécution de l'applet >ls Essai.java >javac Essai.java >ls Essai.class Essai.java >java Essai Exception in thread "main" java.lang.NoSuchMethodError: main >appletviewer Essai Exception d'E/S pendant la lecture de /home/grimaldi/workspace/appletProg/src/Essai (No such file or directory) >gedit page.html >appletviewer page.html Autre manière : >firefox page.html Classe Essai hérite de la classe Applet La maison dans l’Applet import java.awt.*; import java.applet.Applet; public class Essai extends Applet { public void paint( Graphics g ) { int largeurFenetre = getSize().width; int hauteurFenetre = getSize().height; int largeur = largeurFenetre/2; // 100; int hauteur = hauteurFenetre/2; // 75; int xHautGauche = (largeurFenetre - largeur)/2; // 50 int yHautGauche = (hauteurFenetre - hauteur)/2; // 50 int xSommet = xHautGauche+largeur/2; int ySommet = yHautGauche-hauteur/3; int plancher = yHautGauche+hauteur; g.drawRect(xHautGauche,yHautGauche,largeur,hauteur); // mur g.setColor(Color.red); g.drawLine(xHautGauche,yHautGauche,xSommet,ySommet); // toit rouge g.drawLine(xSommet,ySommet,xHautGauche+largeur,yHautGauche); g.setColor(Color.blue); Classe String g.fillRect(xHautGauche+largeur/4,yHautGauche+hauteur/3, largeur/4,2*hauteur/3); // porte bleue g.setColor(Color.green); g.drawOval(xSommet,yHautGauche+hauteur/3, largeur/4,largeur/4); // fenetre verte g.setColor(Color.black); String mess = "Ma petite maison dans l'Applet"; g.drawString(mess,(largeurFenetre-g.getFontMetrics().stringWidth(mess))/2 ,plancher+25); } } Applet ? Hiérarchie de classes couvrant les composants de awt Classe abstraite décrit les caractéristiques communes à tous les composants Object Classe abstraite composants pouvant contenir d’autres composants Component Canvas Button List CheckBox TextComponent TextField Choice ScrollBar TextArea Container Label Window Frame Panel Dialog FileDialog ScrollPane Applet Interface graphiques Abstract Window Toolkit (AWT) Classe de base des awt : la classe abstraite Component. Swing Classe de base des composants swing : JComponent. AWT swing MenuBar Label TextField Choice List Checkbox Button SWING Positionnement des composants Les instances dérivées de la classe Applet héritent (de la classe Container) de deux fonctions: setLayout et getLayout public void setLayout(LayoutManager mgr) public LayoutManager getLayout() LayoutManager (gestionnaires de géométrie ) Les composants sont insérés dans l’Applet au moyen de sa méthode add Component add(Component comp) Exemple: Button b = new Button("Test1"); add(b); LayoutManager java.awt.BorderLayout North java.awt.FlowLayout West one Center South four three two East java.awt.GridLayout one five four two three BoxLayout five six GridBagLayout CardLayout Un seul composant par zone ! LayoutManager Panel pour regrouper MenuBar Label TextField Choice List tfPanel chPanel lstPanel cbPanel Checkbox rbPanel btPanel Button Dans une Applet import java.awt.*; import java.applet.Applet; public class Essai extends Applet { public void init(){ setLayout(new BorderLayout()); Panel p=new Panel(); p.setLayout(new FlowLayout ()); p.add(new Button("Test1")); p.add(new Button("Test2")); p.add(new Button("Test3")); p.add(new Button("Test4")); add("North",p); Panel p2=new Panel(); p2.setLayout(new FlowLayout ()); p2.add(new Label("Etiq1")); p2.add(new Label("Etiq2")); add("Center",p2); Panel p3=new Panel(); p3.setLayout(new FlowLayout ()); p3.add(new TextField("Zone1")); p3.add(new TextField("Zone2")); p3.add(new TextField("Zone3")); add("South",p3); } } AWT GUI Form Dans une application JAVA graphique import java.awt.*; class Fpanel { static public void main (String arg [ ]) { Frame w = new Frame("Exemple de fenetre ") ; w.setLayout(new BorderLayout()); Panel p=new Panel(); p.setLayout(new FlowLayout ()); p.add(new Button("Test1")); p.add(new Button("Test2")); p.add(new Button("Test3")); p.add(new Button("Test4")); w.add("North",p); Panel p2=new Panel(); p2.setLayout(new FlowLayout ()); p2.add(new Label("Etiq1")); p2.add(new Label("Etiq2")); w.add("Center",p2); Panel p3=new Panel(); p3.setLayout(new FlowLayout ()); p3.add(new TextField("Zone1")); p3.add(new TextField("Zone2")); p3.add(new TextField("Zone3")); w.add("South",p3); w.show(); w.pack(); } } Swing : JApplet Interface o Une interface représente une fonctionnalité particulière décrite par un ensemble de déclarations de variables et/ou de méthodes. o Lorsqu'une classe implémente une interface (possède cette fonctionnalité) elle donne une existence réelle à ces variables et méthodes. o Pour déclarer cette interface, on utilise le mot-clé implements. Ceci donne : public class ma_classe implements une_interface { .... } o Le compilateur java n'effectuera correctement son travail que si les variables et/ou méthodes annoncées dans l'interface sont bien présentes dans la classe. Interface MouseListener L'interface MouseListener permet à une classe de répondre aux événements souris de base. Elle est définie dans le package java.awt.event qu'il faut donc importer. Elle contient les méthodes suivantes : public void void mouseClicked(MouseEvent mouseClicked(MouseEvent e) e) public public void void mousePressed(MouseEvent mousePressed(MouseEvent e) e) public public void void mouseReleased(MouseEvent mouseReleased(MouseEvent e) e) public public void void mouseEntered(MouseEvent mouseEntered(MouseEvent e) e) public public void void mouseExited(MouseEvent mouseExited(MouseEvent e) e) public import java.awt.*; java.awt.*; import import java.awt.event.*; java.awt.event.*; import public class class drag drag extends extends java.applet.Applet java.applet.Applet public implements MouseListener MouseListener {{ implements .... .... public void void init() init() {{ public addMouseListener(this); addMouseListener(this); }} .... .... }} Exemple : MouseListener import java.applet.*; java.applet.*; import import java.awt.Graphics; java.awt.Graphics; import import java.awt.event.MouseEvent; java.awt.event.MouseEvent; import import java.awt.event.MouseListener; java.awt.event.MouseListener; import public class class Application Application extends extends Applet Applet implements implements MouseListener{ MouseListener{ public int xd[], xd[], yd[]; yd[]; int int xf[], xf[], yf[]; yf[]; int static final final int int nsegments nsegments == 10; 10; static int n, n, ns; ns; int // debuts debuts des des segments segments // // fin fin des des segments segments // // nbre nbre de de segments segments max max // // pour pour compter compter les les segments segments // public void void init() init() {{ public // création création des des tableaux tableaux // xd == new new int[nsegments]; int[nsegments]; xd yd == new new int[nsegments]; int[nsegments]; yd xf == new new int[nsegments]; int[nsegments]; xf yf == new new int[nsegments]; int[nsegments]; yf // premier premier segment segment // ns == nn == 0; 0; ns addMouseListener(this); addMouseListener(this); }} démo Exemple : MouseListener public void void mouseEntered(MouseEvent mouseEntered(MouseEvent arg0) arg0) {{ }} public public void void mouseExited(MouseEvent mouseExited(MouseEvent arg0) arg0) {{ }} public public void void mousePressed(MouseEvent mousePressed(MouseEvent arg0) arg0) {{ public xd[n] == arg0.getX(); arg0.getX(); xd[n] yd[n] == arg0.getY(); arg0.getY(); yd[n] }} public void void mouseReleased(MouseEvent mouseReleased(MouseEvent arg0) arg0) {{ public xf[n] == arg0.getX(); arg0.getX(); xf[n] yf[n] == arg0.getY(); arg0.getY(); yf[n] (n+1)%nsegments; // prochain prochain point point nn == (n+1)%nsegments; // ns++; ns++; if (ns>=nsegments)ns (ns>=nsegments)ns == nsegments-1; nsegments-1; if repaint(); // forçage forçage du du dessin dessin de de l'applet l'applet repaint(); // }} public void void mouseClicked(MouseEvent mouseClicked(MouseEvent arg0) arg0) {{ public // récupération récupération du du click click droit droit // if (arg0.getButton()==3){ (arg0.getButton()==3){ // // click click droit droit if ns == 0; 0; nn == ns }} }} Exemple : MouseListener public void void paint(Graphics paint(Graphics g){ g){ public // affichage affichage de de tous tous les les segments segments // for (int (int i=0 i=0 ;; i<ns i<ns ;; i++) i++) for g.drawLine(xd[i], yd[i], yd[i], xf[i], xf[i], yf[i]); yf[i]); g.drawLine(xd[i], }} démo Interface MouseMotionListener L'interface MouseMotionListener permet à une classe de répondre aux événements liés au déplacement de la souris. Elle est définie dans le package java.awt.event qu'il faut donc importer. Elle contient les méthodes suivantes : public void void mouseDragged(MouseEvent mouseDragged(MouseEvent e) e) public public void void mouseMoved(MouseEvent mouseMoved(MouseEvent e) e) public import java.awt.*; java.awt.*; import import java.awt.event.*; java.awt.event.*; import public class class drag drag extends extends java.applet.Applet java.applet.Applet public implements MouseListener, MouseListener, MouseMotionListener MouseMotionListener {{ implements .... .... public void void init() init() {{ public addMouseListener(this); addMouseListener(this); addMouseMotionListener(this); addMouseMotionListener(this); }} .... .... }} Exemple : MouseMotionListener import java.applet.Applet; java.applet.Applet; import import java.awt.Graphics; java.awt.Graphics; import import java.awt.event.MouseEvent; java.awt.event.MouseEvent; import import java.awt.event.MouseMotionListener; java.awt.event.MouseMotionListener; import public class class Application Application extends extends Applet Applet implements implements MouseMotionListener MouseMotionListener {{ public int x, x, y; y; int int state; state; int public void void init(){ init(){ public state == 0; 0; state addMouseMotionListener(this); addMouseMotionListener(this); }} public void void mouseDragged(MouseEvent mouseDragged(MouseEvent arg0) arg0) {{ public state == 2; 2; state arg0.getX(); xx == arg0.getX(); arg0.getY(); yy == arg0.getY(); repaint(); repaint(); }} Exemple : MouseMotionListener public void void mouseMoved(MouseEvent mouseMoved(MouseEvent arg0) arg0) {{ public state == 1; 1; state arg0.getX(); xx == arg0.getX(); arg0.getY(); yy == arg0.getY(); repaint(); repaint(); }} public void void paint paint (Graphics (Graphics g){ g){ public switch (state){ (state){ switch case 11 :: g.drawOval(x-20, g.drawOval(x-20, y-20, y-20, 20, 20, 20); 20); break; break; case case 22 :: g.drawRect(x-20, g.drawRect(x-20, y-20, y-20, 40, 40, 40); 40); break; break; case }} }} }} Interface KeyListener L'interface KeyListener permet à une classe de répondre aux événements liés au clavier (appui sur une touche, relâchement, ...). Elle est définie dans le package java.awt.event qu'il faut donc importer. Elle contient les méthodes suivantes : public void void keyTyped(KeyEvent keyTyped(KeyEvent e) e) public public void void keyPressed(KeyEvent keyPressed(KeyEvent e) e) public public void void keyReleased(KeyEvent keyReleased(KeyEvent e) e) public import java.awt.*; import java.awt.event.*; public class drag extends java.applet.Applet implements KeyListener { .... public void init() { addKeyListener(this); } .... } Interface ActionListener L'interface ActionListener permet à une classe de répondre à des actions faites sur des composants qu’elle contient (bouton, menus, .etc.). Elle est définie dans le package java.awt.event qu'il faut donc importer. Elle contient les méthodes suivantes : public void void actionPerformed(ActionEvent actionPerformed(ActionEvent evt) evt) public import java.awt.*; import java.awt.event.*; public class drag extends java.applet.Applet implements ActionListener { .... public void init() { addActionListener(this); } .... } un convertisseur dollar/euro import java.applet.Applet; import java.awt.event.*; import java.awt.*; public class Converter extends Applet implements ActionListener { static double tauxChangeEuroDollar=1.2782; TextField dollars; TextField euros; public void init(){ dollars = new TextField(10); euros = new TextField(10); this.setLayout(new BorderLayout()); // placement nord/sud/est/west Label l = new Label("Convertisseur dollar US / Euro"); l.setFont(new Font("SansSerif",Font.BOLD,16)); add("North", l); Panel p = new Panel(); p.setLayout(new FlowLayout()); p.add(new Label("dollars")); p.add(dollars); p.add(new Label("euros")); p.add(euros); add("Center", p); Button b = new Button("Convertir"); b.setFont(new Font("SansSerif",Font.BOLD,16)); add("South", b); b.addActionListener(this); } …/ un convertisseur dollar/euro public void actionPerformed(ActionEvent arg0) { if (arg0.getActionCommand().equals("Convertir")){// le bon bouton double valeur = Double.valueOf(dollars.getText()); valeur = valeur/tauxChangeEuroDollar; euros.setText(String.valueOf(valeur)); } } } un convertisseur dollar/euro public void actionPerformed(ActionEvent arg0) { if (arg0.getActionCommand()=="Convertir"){ // le bon bouton try { double valeur = Double.valueOf(dollars.getText()); valeur = valeur/tauxChangeEuroDollar; euros.setText(String.valueOf(valeur)); } catch (NumberFormatException nx) { euros.setText("impossible"); } } } } Lire dans un fichier package javaapplication11; import java.util.Scanner; import java.util.*; import java.awt.FileDialog; import java.awt.Frame; import java.io.File; import java.io.FileNotFoundException; public class JavaApplication11 { private static Frame fenetre; public static void main(String[] args) throws FileNotFoundException { fenetre = new Frame(); fenetre.setTitle("Une application Graphique Swing"); // son titre fenetre.setSize(300,200); // sa taille fenetre.setVisible(true); // affichage // récupération du nom du fichier FileDialog dialog = new FileDialog(fenetre); dialog.show(); String fileName = dialog.getDirectory()+dialog.getFile(); File fichier = new File(fileName); if (!fichier.exists())return; Scanner sc = new Scanner(fichier); do{ String str = sc.nextLine(); System.out.println(str); }while (sc.hasNextLine()); } } Lire un tableau dynamique ArrayList package exercice2ds; import java.awt.FileDialog; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Scanner; import javax.swing.JFrame; // la classe boule class Boule{ private int x; private int y; private int r; public Boule(){ x = y = r = 0; } public Boule(int x, int y, int r){ this.x = x; this.y = y; private static JFrame fenetre; this.r = r; private static ArrayList <Boule> btab; } public static void main(String[] args) throws FileNotFoundException { public String toString(){ fenetre = new JFrame(); fenetre.setTitle("Une application Graphique"); String br = "("+x+","+y+","+r+")"; // son titre return br; fenetre.setSize(800, 700); // sa taille } fenetre.setVisible(true); // affichage public class Exercice2DS{ // instanciation du tableau btab = new ArrayList <Boule>(); // récupération du nom du fichier FileDialog dialog = new FileDialog(fenetre); dialog.show(); String fileName = dialog.getDirectory()+dialog.getFile(); File fichier = new File(fileName); if (!fichier.exists())return; Scanner sc = new Scanner(fichier); // lecture du fichier Lire un tableau dynamique ArrayList // lecture du fichier do{ String str = sc.nextLine(); String fargs[] = str.split(";"); Boule b; try{ b = new Boule(Integer.parseInt(fargs[0]), Integer.parseInt(fargs[1]), Integer.parseInt(fargs[2])); btab.add(b); } catch (NumberFormatException nx){ continue; } }while (sc.hasNextLine()); sc.close(); // affichage des données for (int i=0 ; i<btab.size() ; i++) System.out.println(btab.get(i)); } } } // fin de la classe Écrire dans un fichier import javax.swing.*; import java.awt.Rectangle; import java.io.*; public class MonApp { public static void main (String[] args) throws InterruptedException, SecurityException, IOException{ JFrame fenetre = new JFrame(); fenetre.setTitle("Une application Graphique Swing"); fenetre.setSize(300,200); JLabel label = new JLabel("Hello World !"); fenetre.getContentPane().add(label); fenetre.setVisible(true); Rectangle r = label.getBounds(); File f = new File ("toto.txt"); // un fichier FileWriter fw = new FileWriter(f); // le writer String br = new String(); // une chaine cat toto.txt // affichage et écriture dans un fichier 8.069956674109191 for (int i=0 ; i<10 ; i++){ 42.5408715787659 br = Double.toString(Math.random()*100); // nombre aléatoire 58.641771058538176 fw.write(br+"\n"); // ecriture 40.43774863023394 r.setLocation(r.x, i*20); 75.43518020135525 label.setBounds(r); 82.83453685331713 Thread.sleep(1000); 11.02509797578909 } 29.599967582785467 fw.close(); 96.37629301380967 System.exit(0); 27.381178971570343 } } Thread : fil d'exécution import java.applet.Applet; import java.awt.Color; import java.awt.Graphics; public class Application extends Applet implements Runnable { int x, y; int dx, dy; int r; int width, height; Thread thread; boolean stopflag; public void init(){ width = this.getBounds().width; height = this.getBounds().height; x = y = height/2; r = 20; dx = dy =1; thread = new Thread(this); thread.start(); stopflag = false; } public void paint(Graphics g){ g.drawOval(xr, yr, 2*r, 2*r); } Thread : fil d'exécution public void run() { while (!stopflag) { width = this.getBounds().width; height = this.getBounds().height; x+=dx; y+=dy; if (x<r || x>widthr )dx = dx; if (y<r || y>heightr)dy = dy; repaint(); try {Thread.sleep(20);} catch(InterruptedException signal) {} } } } Sérialisation des objets La sérialisation est un procédé introduit dans le JDK qui permet de rendre un objet persistant. public class Personne implements java.io.Serializable { private String nom = ""; private String prenom = ""; private int taille = 0; public Personne(String nom, String prenom, int taille) { this.nom = nom; this.prenom = prenom; this.taille = taille ; } public void affiche(){ System.out.println(nom); System.out.println(prenom); System.out.println(taille); } } La classe ObjectOuputStream La classe ObjectOutputStream permet de sérialiser et de sauver des objets sérialisables ou des types élémentaires: writeInt(), writeDouble(), writeFloat(), ... import java.io.*; public class SerializerPersonne{ public static void main(String argv[]) { Personne personne = new Personne("Dupond","Jean",175); try { FileOutputStream fichier = new FileOutputStream("personne.bin"); ObjectOutputStream oos = new ObjectOutputStream(fichier); oos.writeObject(personne); oos.flush(); oos.close(); } catch (java.io.IOException e) { e.printStackTrace(); } } } On peut peut stocker plusieurs objets sérialisés dans un même fichier La classe ObjectInputStream La classe ObjectOutputStream permet de sérialiser et de sauver des objets sérialisables ou des types élémentaires: writeInt(), writeDouble(), writeFloat(), ... import java.io.*; public class DeSerializerPersonne { public static void main(String argv[]) { try { FileInputStream fichier = new FileInputStream("personne.ser"); ObjectInputStream ois = new ObjectInputStream(fichier); Personne personne = (Personne) ois.readObject(); Personne.affiche() ; } catch (java.io.IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } On peut peut stocker plusieurs objets sérialisés dans un même fichier Applications embarquées sous Android Documentation officielle http://developer.android.com/reference/packages.html Plate-forme de développement Tegra Android Development Pack - TADP Environnement de développement complet: • Android SDK r18 • Android APIs • Google USB Driver • Android NDK r8 • JDK 6u24 • Cygwin 1.7 • Eclipse 3.7.1 • CDT 8.0.0 • ADT 18.0.0 • Apache Ant 1.8.2 • Python 2.7 https://developer.nvidia.com/tegra-android-development-pack Java sur plate-forme Android Java sur plate-forme Android Structure d'un projet src : répertoire contenant l’ensemble des sources du projet. Il contient les classes de type activité (voir ci-dessous) qui gèrent entre autre le cycle de vie d’une page, mais aussi les classes permettant de piloter les différentes fonctions de l’application. gen : répertoire contenant l’ensemble des fichiers générés par le plugin correspondant à l’environnement de développement. Aucune modification ne doit être faite dans ces fichiers. androidManifest.xml : fichier XML décrivant l’application et ses composants, tels que les activités, les services etc. Lors de la création d’une activité, une erreur courante pour un premier projet Android est d’oublier de la déclarer dans le fichier manifeste. C’est une étape indispensable pour le fonctionnement de l’application. Le manifeste est en quelque sorte la carte d’identité de l’application, et permet d’autoriser l’exécution des activités et autres actions de l’application (fonctionnement que l’on retrouve dans différents formats d’application J2EE). Structure d'un projet res : répertoire contenant toutes les ressources telles que les images, les vues de l’interface graphique, etc. nécessaires à l’application. Ce répertoire est structuré par défaut de la manière suivante : res/drawable : contient les ressources de type image res/layout : contient les descriptions des interfaces graphiques au format XML (les vues) res/xml : contient les fichiers XML supplémentaires (non présents par défaut) res/menu : contient la description des menus, composants très courants d’une vue res/values : contient diverses ressources, tels que les textes, qui sont empaquetées sans aucun traitement. Au moment de la compilation du projet, l’application finale est générée au format APK, dans le répertoire « bin » de l’arborescence. C’est ce fichier qu’il faut ensuite déployer sur les équipements afin de pouvoir exécuter l’application. Composante d'une application Activities Une activité est la composante principale pour une application Android. Elle représente l’implémentation et les interactions de vos interfaces. Services Un service, à la différence d’une activité, ne possède pas de vue mais permet l’exécution d’un algorithme sur un temps indéfini. Il ne s’arrêtera que lorsque la tâche est finie ou que son exécution est arrêtée. Il peut être lancé à différents moments : Au démarrage du téléphone. Au moment d’un événement (arrivée d’un appel, SMS, mail, etc…). Lancement de votre application. Action particulière dans votre application. Composante d'une application Broadcast and Intent Receivers Un Broadcast Receiver comme son nom l’indique permet d’écouter ce qui se passe sur le système ou sur votre application et déclencher une action que vous aurez prédéfinie. C’est souvent par ce mécanisme que les services sont lancés. Content providers Les « content providers »servent à accéder à des données depuis votre application. Vous pouvez accéder : Aux contacts stockés dans le téléphone. A l’agenda. Aux photos. Ainsi que d’autres données depuis votre application grâce aux content providers. Cycle de vie d'une application onCreate : appelée à la création de votre activité (Activity). Elle sert à initialiser votre activité ainsi que toutes les données nécessaires à cette dernière. Quand la méthode onCreate est appelée, on lui passe un Bundle en argument. Ce Bundle contient l’état de sauvegarde enregistré lors de la dernière exécution de votre activité. Cycle de vie d'une application onStart : signifie le début d’exécution de votre activité (début du passage au premier plan). Si votre activité ne peut pas aller en avant plan quelque soit la raison, l’activité sera transférée à OnStop. Cycle de vie d'une application onResume : Cette méthode est appelée après onStart (au moment où votre application repasse en foreground). A la fin de l’appel à la méthode onResume votre application se trouve au premier plan et reçoit les interactions utilisateurs. Cycle de vie d'une application onPause : Si une autre activité passe au premier plan, la méthode onPause est appelée, afin que vous sauvegardiez l’état de l’activité et les différents traitements effectués par l’utilisateur. A ce stade, votre activité n’a plus accès à l’écran, vous devez arrêter de faire toute action en rapport avec l’interaction utilisateur (désabonner les listeners). Vous pouvez par contre continuer à exécuter des algorithmes nécessaires mais qui ne consomment pas trop de CPU. Cycle de vie d'une application onStop : Appelée quand votre activité n’est plus du tout visible quelque soit la raison. Dans cette méthode vous devez arrêter tous les traitements et services exécutés par votre application.. Cycle de vie d'une application onDestroy : Appelée quand votre application est totalement fermée (Processus terminé). Toutes les données non sauvegardées sont perdues Exemple Convertisseur kilomètre / mile nautique Code de l'activitée public class EssaiActivity extends Activity implements View.OnTouchListener, View.OnClickListener, Runnable { /** Called when the activity is first created. */ Button b = null; EditText src = null; EditText dst = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); b = (Button) findViewById(R.id.button1); b.setOnTouchListener(this); b.setOnClickListener(this); src = (EditText) this.findViewById(R.id.editText1); dst = (EditText) this.findViewById(R.id.editText2); } Code de l'activitée package essai.grimaldi; import android.view.View.OnTouchListener; import android.view.View.OnClickListener; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.EditText; Code de l'activitée // méthode onTouch public boolean onTouch(View v, MotionEvent event) { /* Réagir au toucher */ Double nm= new Double(src.getText().toString()); double km=nm.doubleValue()*1.852; dst.setText(String.valueOf(km)); src.setText(src.getText().toString()); return true; } // méthode onClick public void onClick(View v) { } // méthode run du Thread public void run(){ } } Layout : main.xml <?xml version="1.0" encoding="utf8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="distance parcourue en mille nautique" /> <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="numberDecimal" > <requestFocus /> </EditText> Layout : main.xml <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="équivalent en kilomètres" /> <EditText android:id="@+id/editText2" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="numberDecimal" /> </LinearLayout> <Button android:id="@+id/button1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Convertir" /> </LinearLayout> Layout : main.xml exécution Application utilisant l'accéléromètre Accéléromètre <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="starting" /> <TextView android:id="@+id/TextView_azimut" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0" /> <TextView android:id="@+id/TextView_pitch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0" /> <TextView android:id="@+id/TextView_roll" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Go!" /> </LinearLayout> Accéléromètre package grimaldi.univtln.fr; import import import import import import import import import import import import android.hardware.Sensor; android.hardware.SensorEvent; android.hardware.SensorEventListener; android.hardware.SensorManager; android.os.Bundle; android.app.Activity; android.util.Log; android.view.Menu; android.view.MotionEvent; android.view.View; android.widget.Button; android.widget.*; public class MainActivity extends Activity implements View.OnTouchListener, SensorEventListener{ Button but; SensorManager sensorMgr; TextView textviewmsg; boolean accelSupported; TextView ta; TextView tp; TextView tr; Accéléromètre protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); but = (Button)findViewById(R.id.button1); but.setOnTouchListener(this); textviewmsg = ((TextView)findViewById(R.id.textView1)); ta = ((TextView)findViewById(R.id.TextView_azimut)); tp = ((TextView)findViewById(R.id.TextView_pitch)); tr = ((TextView)findViewById(R.id.TextView_roll)); } public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is // present. getMenuInflater().inflate(R.menu.main, menu); return true; } Accéléromètre public boolean onTouch(View v, MotionEvent event) { sensorMgr = (SensorManager)getSystemService(SENSOR_SERVICE); accelSupported = sensorMgr.registerListener(this, sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI); if (!accelSupported) { sensorMgr.unregisterListener(this, sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)); textviewmsg.setText("Pas d’accelerometre"); } else textviewmsg.setText("accelerometre trouvé"); return false; } Accéléromètre public void onAccuracyChanged(Sensor sensor, int accuracy) { switch(accuracy){ case SensorManager.SENSOR_STATUS_ACCURACY_HIGH: case SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM: case SensorManager.SENSOR_STATUS_ACCURACY_LOW: case SensorManager.SENSOR_STATUS_UNRELIABLE: } Log.d("Sensor",sensor.getType()+":"+accuracy); } public void onSensorChanged(SensorEvent event) { if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){ ta.setText(""+event.values[0]+"°"); tp.setText(""+event.values[1]+"°"); tr.setText(""+event.values[2]+"°"); } }