précédant | suivant | sommaire

[FAQ] fr.comp.lang.java



Voilà, je vous sers cette faq comme vous pouvez la trouver sur le news-groupe fr.comp.lang.java , je n'ai fais que la mettre en page pour en simplifier sa lecture qui est trés interressante. Chapeau à Christophe Jolif qui entretient cette faq.
alain Adelmar aadelmar@wanadoo.fr

A toujours consulter avant de poser une question dans ce groupe !

Consultez aussi la documentation de Sun dans votre répertoire d'installation
du jdk ou sur le site javasoft ( http://java.sun.com/products/jdk/1.1 )

-> le guide de l'API : docs/api/packages.html
-> le guide général  : docs/index.html

Qui répondrons a la majorité de vos questions.

HISTORIQUE DES DERNIERES VERSIONS

Version  Date    Description

1.0   15/09/1996  Version de base
2.0   08/06/1997  Prise en compte JDK 1.1.x
3.0   22/03/1999  Prise en compte la plate-forme Java 2
3.2   25/02/2000  Mise à jour.
 

A PROPOS DE CETTE FAQ
 

FAQ = Frequently Ask Questions
    = Questions Fréquemment posées
    = Foire Aux Questions

Cette FAQ reprend donc les questions les plus souvent posées dans le
newsgroup fr.comp.lang.java et tente d'y répondre ! Donc, toute personne
participant à la discussion est grandement remerciée pour sa contribution à
la réalisation de cette FAQ.

Cette FAQ a été crée suite a une proposition postée dans le groupe de
nouvelles fr.comp.lang.java à l'initiative de Christophe Jolif
( Christophe.Jolif@wanadoo.fr ). Elle est maintenue par :

 - Christophe Jolif ( Christophe.Jolif@wanadoo.fr )

à qui vous pouvez adresser vos remarques.

Cette FAQ peut être reproduite par quelques moyens que ce soit mais ne doit
en aucun cas être modifiée par ajout ou suppression. Pour obtenir une
correction ou proposer un ajout, demander aux mainteneurs. Cela permet
d'éviter une multiplication des versions.

Elle est postée deux fois par mois dans les groupes fr.comp.lang.java et
fr.usenet.reponses.

Elle est aussi théoriquement disponible directement sur le site Web
http://perso.wanadoo.fr/transit/java.html

Les créateurs/mainteneurs de cette FAQ, n'ont en fait pas grand mérite si ce
n'est celui de suivre régulièrement le groupe et d'en faire une synthèse.


SOMMAIRE

1. Questions Générales
 1.1 Qu'est ce que JAVA ?
 1.2 Qu'est ce que le JDK ?
 1.3 Différences Application/Applet/Servlet ?
 1.4 Qu'est ce que Hot Spot ?
2. Le langage
 2.1 Peut-on surcharger les opérateurs comme en C++ ?
2.2 Mon compilateur n'accepte pas la déclaration : int tab[5] ?
 2.3 Ma classe refuse d'hériter de plusieurs autres ?
 2.4 Quand je compile ma classe, j'obtiens une erreur du type :
 2.5 Que veut dire le mot clef final ?
 2.6 Comment lancer une commande ou un exécutable non Java à partir du code
Java ?
 2.7 Qu'est ce qu'une inner class ?
 2.8 Quel est l'équivalent Java des pointeurs sur fonctions C/C++ ?
 2.9 Comment faire en sorte que le paramètre int de ma méthode soit modifié
en retour ?
 2.10 Qu'est ce qu'une classe anonyme ?
 2.11 Comment remplacer les enum C/C++ en Java ?
 2.12 Existe-t-il des templates en Java ?
3. Les outils Java
 3.1 Java ne trouve pas mes classes ?
3.2 Comment compiler et exécuter ?
 3.3 Jdb refuse de se lancer en levant des exceptions "réseaux" ?
 3.4 appletviewer ne fonctionne pas sur appletviewer maclass.class ?
 3.5 Quand j'exécute mon application Java sur un Terminal X, j'ai des
problèmes de segmentation fault.
 3.6 Comment ne pas lancer le jit en lançant Java 2 car –nojit ne fonctionne
plus ?
 3.7 Quelle est la différence entre java.exe et javaw.exe sous Windows ?
 3.8 En Java 2, je ne trouve pas le fichier classes.zip !
 3.9 Est-il possible de compiler du code Java vers un exécutable machine ?
4. AWT et Java2D (JAVA.AWT.*, JAVA.AWT.EVENT.*, JAVA.AWT.DATATRANSFER.*, JAVA.AWT.GEOM.*)
 4.1 Qu'est ce que AWT ?
4.2 Les événements de types MOUSE_ENTER ou _EXIT ne sont pas transmis a mes
éléments de la classe Button, que faire (JDK 1.0.x) ?
 4.3 Comment mettre une image dans un bouton ?
 4.4 Comment changer la forme du curseur de la souris ?
 4.5 Comment récupérer les événements sur un Component a partir du JDK 1.1.x
?
 4.6 Comment imprimer l'ensemble d'un Container (JDK 1.1.x) ?
 4.7 Comment traiter les "double click" dans un mouseListener ?
 4.8 Comment connaître le bouton de souris concerné par un événement ?
 4.9 Je n'arrive pas a faire du cut/paste inter applications en JDK1.1.x ?
 4.10 Comment lire une image dans une application puisque je ne dispose pas
de Applet.getImage(URL) ?
 4.11 Si cette image est dans un .jar lu par un application la solution si
dessus ne fonctionne pas.
 4.12 Comment faire en sorte que lors d'un double click de la souris l'action
sur le simple click ne soit pas exécutée ?
 4.13 Comment récupérer la taille de l'écran ?
 4.14 Comment enregistrer une image ?
 4.15 Qu'est ce que Java 2D ?
 4.16 Comment dessiner une Spline en Java ?
 4.17 Après avoir appuyé sur un bouton ou choisi un menu pour exécuter une
action, mon interface est comme bloquée et ne se dessine plus ?
5. Les classes de bases
 5.1 Quelle fonction permet de récupérer la valeur d'une variable
d'environnement ?
 5.2 Comment transformer une String en entier ?
 5.3 Qu'est ce que l'API de reflexion (Java Core Reflection API) ?
(Comment créer une instance d'une classe dont on connaît le nom)
 5.4 Comment calculer le cosinus ou sinus d'un nombre ?
 5.5 Comment rediriger ce qui est envoyé sur la sortie standard (System.out)
?
 5.6 Comment connaître l'heure courante (JDK1.1.x) ?
 5.7 Comment formatter un nombre pour avoir par exemple 2 chiffres après la
virgule ?
 5.8 Comment découper une chaîne (String) en morceaux ?
 5.9 Comment transformer une chaîne en float et inversement ?
6. JDBC
 6.1 Comment effectuer une requete sur une base de donnees ?
 6.2 Comment récupérer le nom d'une colonne par exemple ?
 6.3 Mon driver JDBC ne fonctionne pas au sein d'une Applet ?
7. Les Applets
 7.1 Certaines méthodes du JDK me demandent une Frame, mais Applet ne
dérivant pas de Frame que passer en argument ?
 7.2 Comment dans une applet afficher une nouvelle page HTML dont on connaît
l'adresse ?
 7.3 Comment récupérer des arguments d'une page HTML dans une applet ?
 7.4 Comment afficher quelque chose dans la barre de status d'un navigateur ?
 7.5 Comment récupérer le source html de la page web sur laquelle on se
trouve ?
 7.6 Comment faire communiquer deux Applets ?
 7.7 Mon applet ne marche pas avec un plugin java que faire ?
8. Les Java Foundation Classes
8.1 Qu'est que les JFC et Swing ?
8.2 Des problèmes graphiques apparaissent lorsque j'utilise Swing ?
8.3 Existe il un objet gérant les timers en java ?
8.4 Comment afficher une info bulle ( Tooltip ) ?
8.5 Comment afficher du HTML dans un composant Swing ?
8.6 Comment traduire le JFileChooser ou le JColorChooser en français ?
8.7 Où trouver les propriétés à passer au UIManager (UIManager.put()) ou aux
objets (JComponent.putClientProperty()) ?
8.8 Peut-on rendre les JTooltip multi-lignes ?
8.9 Comment mélanger un JTree Swing et une JTable ?
8.10 Que faut-il faire pour avoir un JTextField n'acceptant que des chiffres
?
9. La programmation réseau
 9.1 Comment savoir si une connexion Socket est toujours établie ?
10. Les autres packages ou outils
10.1 Apache supporte-t-il les servlets ?
10.2 Comment accéder au registre de Windows avec Java ?
10.3 Comment supprimer d'une archive jar les fichiers inutiles à l'exécution
d'une application ou applet ?
11. Java et ....
11.1 Java et C/C++
11.2 Java et JAVASCRIPT
11.3 Applet Java et CGI/BIN
11.4 Java et l'Euro !
11.5 Java et XML.
12. Questions sur les Ressources
12.1 Où trouver les Java Foundation Classes 1.1.1 (Swing) ?
12.2 Où se procurer des pré-versions des nouvelles API de Sun ?
12.3 Sites spécialisés dans le portage de la machine ou d'un IDE sur un OS ?
12.4 Où trouver la liste des différents caractères UNICODE ?
12.5 Où trouver un driver JDBC pour Msql ?
12.6 Où trouver un driver JDBC pour Oracle ?
12.7 Où trouver un driver JDBC pour Interbase ?
12.8 Où trouver la liste des drivers JDBC connus ?
12.9 Classes permettant de traiter des collections d'objets ?
12.10 Existe-t-il un serveur HTTP ecrit en Java ?
12.11 Où trouver d'autre Layout Managers que ceux de AWT ?
12.12 Existe-t-il des alternatives à AWT ?
12.13 Existe-t-il des sites JAVA en français ?
12.14 Existe-t-il des décompilateurs de byte code ?
12.15 Où peut-on trouver un client RPC en Java ?
12.16 Où trouver des codes lisp pour un mode Java sous Emacs ?
12.17 Existe-t-il une mailing list sur java en francais ?
12.18 Existe-t-il une mailing list sur java et corba ?
12.19 Où trouver des informations concernant les applets signées ?
12.20 Existe-t-il un equivalent a Lex et Yacc en Java ?
12.21 Où trouver Thinking In Java (le pdf) :
12.22 Existe-t-il des classes permettant de gérer le port série et parallèle
?
12.23 Existe-t-il un package permettant de gérer les expressions régulières
?
12.24 Existe-t-il d'autre debugger que jdb ?
12.25 Existe-t-il un package pour gérer l'envoi de mail ?
12.26 Où trouver des informations sur JSP ?
12.27 Où trouver des informations sur les servlets ?
12.28 Je m'intéresse à l'obfuscation, où trouver des informations ?

1. QUESTIONS GENERALES

1.1 Qu'est ce que JAVA ?

La première et la plus difficile des questions : pour être concis, il s'agit d'un langage orienté objet développé par la société Sun. Son même code ( ou plus exactement byte-code ) peut être exécuté sur différentes machines. Le byte-code de JAVA est interprété par une machine virtuelle qui existe pour différents environnement :

 Windows95/NT
 MacOS
 Solaris
 Linux
 AIX
 OS/2
 IRIX
 UnixWare
 HP/UX
 Digital Unix
 AmigaOS
 BeOS
 OpenVMS
 FreeBSD
 SunOS
 Windows 3.1
 Windows CE
 RiscOS
 (liste non exhaustive)

Sans cette machine vous ne pourrez rien faire.

1.2 Qu'est ce que le JDK ?

C'est l'environnement de développement minimum pour faire du java. Il comprend notamment :

 javac -> le compilateur
 java -> la machine virtuelle
 javah -> pour l'interfacage avec le langage C
 javap -> permet le desassemblage
 javadoc -> créateur de documentations
 jdb -> debugueur

A partir du JDK 1.1.x, on peut aussi citer :

 jar -> compacte différents fichiers .class
 native2ascii -> transforme un fichier au format unicode
 rmic -> génère des objets distants a partir d'une classe java utilisant la rmi
 rmiregistry -> crée et lance un tel objet sur le port specifié de la machine courante
 javakey -> outil sur la sécurité
 serialver -> récupère l'UID d'une classe 'serialisable'

A partir du JDK 1.2.x, viennent entre autres :

 tnameserv -> fournit un accès au service de nommage
 idltojava -> utile avec les nouvelles extensions CORBA de Java 2.

La dernière version officielle du JDK de Sun est la version 1.2.2 ( Solaris
et Windows ), cependant, les portages sur certaines autres machines ainsi
que pour certains navigateurs Web en sont encore aux versions précédentes.
La version Java correspondant aux JDK 1.2.x est officiellement nommée la
plate-forme Java 2 et le JDK correspondant est nommé le SDK v1.2.x pour la
plate-forme Java 2.

A titre d'information, la version 1.2 du JDK pour Linux est disponible en
pré-version. Les versions 4.x de Internet Explorer ( Microsoft ), de
Communicator ( Netscape ) et la dernière version de HotJava ( Sun )
intègrent une version 1.1.x. Pour utiliser Java 2 avec un navigateur, il
faut faire appel à un plugin ( par exemple Java Plug In ) qui permet de
lancer une autre machine virtuelle ( par exemple celle de Sun ) dans le
navigateur [cf 7.7]

Toujours à titre d'information le JDK1.3 ( ou SDK v1.3 pour Java 2 ) de Sun
est actuellement disponible en pré-version [cf 12.1].

1.3 Différences Application/Applet/Servlet ?

Une application Java est un programme utilisant le langage de programmation
Java et qui tourne généralement sur la machine ou se trouve au départ le
code. Il a le même but qu'un programme C ou d'un autre langage. L'applet est
elle récupérée à distance à travers un navigateur Web et s'exécute sur
celui-ci.

En raison de ce téléchargement à distance, les règles de sécurité concernant
les applets sont très strictes ( pour éviter notamment les virus ). Par
exemple, une applet ( contrairement à une application ), ne permet pas
forcément l'écriture sur le disque local ou l'impression.

Une servlet est elle destinée à ajouter des fonctionnalités à un serveur web
acceptant ce type d'extension en Java.

1.4 Qu'est ce que Hot Spot ?

Hot Spot est une machine virtuelle [cf 1.1] optimisée de Sun. Elle permet
d'exécuter le byte-code Java de manière plus rapide. Ceci est surtout vrai
pour les serveur. En effet le temps perdu par Hot Spot pour optimiser le
code lors de son premier passage, va entraîner la nécessité de passer de
nombreuses fois sur ce code pour que le temps perdu la première fois soit
compensé par les optimisations et ceci est particulièrement vrai pour les
serveurs. Sun annonce une version d'Hot Spot pour les clients qui sera livré
avec le JDK1.3.
 
 

2. QUESTIONS SUR LE LANGAGE

2.1 Peut-on surcharger les opérateurs comme en C++ ?

Non et cela fait partie des choix/spécifications de Java.

2.2 Mon compilateur n'accepte pas la déclaration : int tab[5] ?

En Java tous les objets sont dynamiques, or les tableaux sont des objets,
ils ne peuvent donc pas être alloués statiquement. Il faut donc faire :

 int tab[];
 tab = new int[5];

ou directement

 int tab[] = new int[5];

comme on ferait MaClasse objet = new MaClasse(param1, param2);

2.3 Ma classe refuse d'hériter de plusieurs autres ?

Contrairement au C++, Java ne permet pas d'héritage ( extends ) multiple
ceci pour éviter les problèmes liés ( notamment l'héritage de deux classes
héritant elles même toutes deux d'une même classe ). Par contre une classe
java peut implémenter plusieurs interfaces et cela permet parfois de passer
outre cette limitation.

2.4 Quand je compile ma classe, j'obtiens une erreur du type :

 "Exception ... must be caught ...."

En Java, les erreurs sont gérées à travers des exceptions qui sont levées
par  exemple quand une méthode ne  peut  pas  aboutir. Le compilateur, ne
laisse pas le développeur ignorer ces exceptions, pour pouvoir les traiter
il faut :

 utiliser une succession try/catch (essaye/attrape):
  try

   ... mes instructions
  }
  catch (mon_type_d_Exception e)

   ... mon traitement si l'erreur intervient
  }
  catch (un_autre_Exception e)

   ...
  }

2.5 Que veut dire le mot clef final ?

Devant une méthode : on ne pourra plus redéfinir cette méthode. Ce qui
entraîne une certaine optimisation dans les appels a cette méthode.

Devant une variable membre : la variable doit être initialisée à la
déclaration et ne pourra plus être modifiée ( constante ).

Devant une classe : on ne  peut pas créer de classe dérivée de celle-ci.
Par   exemple il est impossible de dériver une classe à partir de la classe
String de  la bibliothèque de base. La solution consisterais a "encapsuler"
String dans une classe de notre conception.

En JDK 1.1.x, final est aussi obligatoire devant toute variable locale ou
paramètre de fonction qui sera utilisé plus tard dans une 'inner class'
(classe intérieure) .

2.6 Comment lancer une commande ou un exécutable non Java à partir du code
Java ?

Pour un exécutable, une portion de code telle que celle-ci peut faire
l'affaire, on peut ensuite  contrôler le processus ('proc') avec les
methodes waitFor(), getInputStream() et getOutputStream().

 Runtime rt = Runtime.getRuntime();
 try

  Process proc = rt.exec("Executable");
 }
 catch (java.io.IOException e) {..}

Attention, si votre appel comprend des arguments il faut être un peu plus
précis et passer à exec un tableau comprenant l'exécutable et ses arguments
sous forme de String.

Concernant une commande ( par exemple la commande changement de répertoire
"cd" ), ce ne sont pas des exécutable. Il faut donc lancer comme exécutable
l'interpréteur de commande (cmd.com sous NT; command.com sous Windows ou le
shell sous Unix ) puis comme argument la commande.

2.7 Qu'est ce qu'une inner class ?

Une inner class ou classe intérieure est une classe déclarée à l'intérieur
même d'une top-level classe.

Ceci n'est possible qu'a partir du JDK 1.1.x.

2.8 Quel est l'équivalent Java des pointeurs sur fonctions C/C++ ?

En Java il n'existe pas de pointeurs sur méthodes, il faut utiliser un objet
la ou en C/C++ vous utilisiez une fonction.

Par exemple au lieu de faire en C/C++ :

typedef void (*ptrFcnt)(int);

et d'utiliser un objet de type ptrFcnt pour passer cette fonction à une
autre.

void fonction(ptrFcnt uneFonction) {
 uneFonction(unint);
}
 

On utilisera un objet implémentant une interface commune :

interface IFonction {
 public void execute(int);
}

class Fonction

 public void execute(int arg) {
 // faire ce que l'on aurait fait dans la fonction
 // uneFonction en C/C++
 }
}

dans une autre classe :

public void fonction(IFonction uneFonction) {
 uneFonction.execute(unint);
}

Un bel exemple de tel méthodologie est le système de callback de AWT, au
lieu de passer des fonctions comme en C/C++, on passe des instances de
classes appelées Listener.

2.9 Comment faire en sorte que le paramètre int de ma méthode soit modifié
en retour ?

En Java les types de base sont passes aux méthodes par valeur, ils ne
peuvent pas être modifiés. Il va falloir utiliser une instance de classe
"encapsulant" un entier pour effectuer la modification. Attention la classe
fournie Integer ne permet pas la modification et est donc inutile dans ce
cas.

Exemple :

class MonEntier {
 private int value;
 public void setValue(int newValue) {
  value = newValue;
 }
 public int getValue() {
  return value;
 }
}

Dans la méthode maMethode faire :

public void maMethode (MonEntier i) {
 i.setValue(maNouvelleValeur);
}

2.10 Qu'est ce qu'une classe anonyme ?

C'est une classe que l'on instancie sans lui donner un nom explicite. Ceci
est souvent utilisé dans les Listener.

addActionListener( new ActionListener() {
 public void actionPerformed(ActionEvent e) {}
}) ;

On a ici crée un classe anonyme héritant de la classe ActionListener.

2.11 Comment remplacer les enum C/C++ en Java ?

Il y a principalement deux types de solutions. Voici la plus simple :

Il faut déclarer une classe :

public class MonEnum{
public final static int Val1=0;
public final static int Val2=1;
public final static int Val3=2;
file://…
}

On peut ensuite utiliser MonEnum.Val1, MonEnum.Val2 etc, ou mieux on peut
faire une interface plutôt qu'une class afin que les classes l'implémentant
puissent directement appeler Val1, Val2...

Le problème reste le typage des éléments, rien n'empêche de passer un objet
d'une énumération à la place d'une autre. D'où une deuxième catégorie de
solutions plus complexes mais permettant d'éviter ce problème. On peut par
exemple penser à utiliser des instances de classes :

public final class MonEnum1 {
 private MonEnum1() {}
 public final static MonEnum1 Val1 = new MonEnum1();
 public final static MonEnum1 Val2 = new MonEnum1();
 public final static MonEnum1 Val3 = new MonEnum1();
}

Ainsi un éventuel objet de type MonEnum2 ne pourra jamais être utilisé à la
place d'un objet de type Enum1 (Enum1.Val1 Enum1.Val2 ...).

2.12 Existe-t-il des templates en Java ?

Non par pour l'instant, cependant Sun étudie dans le cadre d'un processus
commun ( community process ) l'intégration d'un mécanisme de généricité à
Java. Un des candidats serait une implémentation Java des templates qui est
disponible à l'adresse suivante :

http://www.cs.bell-labs.com/~wadler/pizza/gj/

3. QUESTIONS SUR LES OUTILS JAVA

3.1 Java ne trouve pas mes classes ?

il faut faire pointer la variable d'environnement CLASSPATH vers les
répertoires de base ou le fichier jar où sont stockées vos classes ( pour
les JDK précédent le 1.2 il faut aussi pointer sur le fichier classes.zip
des classes Java). Attention pour les utilisateur de Windows les
majuscules/minuscules sont importantes.

3.2 Comment compiler et exécuter ?

Supposons le fichier source foo.java

 -> compilation : javac Foo.java
 -> execution : java Foo

Attention, il faut que le fichier porte exactement (majuscules / minuscules
comprises) le nom de la classe publique du fichier ( la classe Foo doit être
dans Foo.java et la classe bar dans bar.java par exemple).

3.3 Jdb refuse de se lancer en levant des exceptions "réseaux" ?

En fait, la version actuelle de jdb nécessite de travailler en reseau. La
solution est de créer une interface loopback (sur nous même 127.0.0.1) qui
suffit a jdb pour fonctionner.

3.4 appletviewer ne fonctionne pas sur appletviewer maclass.class ?

L'appletviewer, comme son nom l'indique est chargé de lancer l'applet d'une
page HTML, il faut donc lui donner en paramètre cette page et non pas une
classe :

appletviewer mapage.html

3.5 Quand j'exécute mon application Java sur un Terminal X, j'ai des
problèmes de segmentation fault.

En fait, il faut que le fichier lib/font.properties dans le répertoire
d'installation du JDK contienne seulement des fontes connues du TX. Un moyen
consiste a renommer ce fichier pour qu'il ne soit plus pris en compte.

3.6 Comment ne pas lancer le jit en lançant Java 2 car –nojit ne fonctionne
plus ?

Il faut préciser NONE comme compilateur : java -Djava.compiler=NONE
application.

3.7 Quelle est la différence entre java.exe et javaw.exe sous Windows ?

javaw.exe n'affichera pas la fenêtre DOS que java.exe affiche
habituellement. L'inconvénient est bien sûr que les traces des éventuelles
exceptions ne seront plus visibles.

3.8 En Java 2, je ne trouve pas le fichier classes.zip !

En JDK1.2 il ne faut plus faire pointer votre CLASSPATH vers un tel fichier.
Il n'existe d'ailleurs plus et est remplacé par des jars et principalement
rt.jar dans le répertoire jre/lib.

3.9 Est-il possible de compiler du code Java vers un exécutable machine ?

Oui certains outils/compilateurs permettent d'obtenir un exécutable ou plus
généralement du code C compilable vers un exécutable. Entre autres :

Toba: http://www.cs.arizona.edu/sumatra/toba
Harissa: http://www.irisa.fr/compose/harissa
EGCS: http://sourceware.cygnus.com/java
TowerJ: http://www.towerj.com

et Visual Cafe également.
 
 

4. AWT ET JAVA2D (JAVA.AWT.*, JAVA.AWT.EVENT.*,
JAVA.AWT.DATATRANSFER.*, JAVA.AWT.GEOM.*)

4.1 Qu'est ce que AWT ?

AWT est un "Abstract Window Toolkit" qui met à la disposition d'un
développeur une API indépendante du système de fenêtrage utilisé : que ce
soit celui du Macintosh, Windows95 ou X-Window. Par contre les objets
affichés sont bien des objets du système correspondant. Les objets Swing
sont quant à eux des objets purement Java.

4.2 Les événements de types MOUSE_ENTER ou _EXIT ne sont pas transmis a mes
éléments de la classe Button, que faire (JDK 1.0.x) ?

La réponse est valable pour d'autres Component ( ceux qui ne sont pas des
Containers ) et pour d'autre événements ( ceux qui ne sont pas des ACTION ).

La classe Button, en effet ne retransmet pas les événements MOUSE_ENTER et
_EXIT. On ne peut donc pas déterminer facilement quand le pointeur passe sur
un tel composant.

La solution, consiste a se créer soit même une classe Button (MyButton par
exemple) qui descend d'une classe Container (Panel par exemple) ainsi, ces
événements seront bien transmis à notre fonction handleEvent() de notre
classe MyButton.

Attention, ce problème n'existe pas en 1.1.x où de toute façon la gestion
des événements est totalement différente.

4.3 Comment mettre une image dans un bouton ?

La aussi ce n'est pas possible en AWT, il faut créer sa propre classe
MyButton permettant de le faire en dérivant par exemple Component pour faire
un lightweigth component.
Si vous utilisez Swing, vous pouvez bien entendu vous servir de la classe
JButton qui accepte les images.

4.4 Comment changer la forme du curseur de la souris ?

Dans la classe java.awt.Frame des variables de classe (variable statique)
definissent des curseurs, en choisir un et faire :

 setCursor(java.awt.Frame.celui_desire)

( par exemple : DEFAULT_CURSOR, WAIT_CURSOR ... )

En JDK 1.1.x cela change, on utilise

 java.awt.Component.setCursor(java.awt.Cursor)

sachant que dans la classe Cursor un certain nombre de curseurs par défaut
sont définit ( DEFAULT_CURSOR, WAIT_CURSOR... ) on peut ainsi changer le
curseur dans un Dialog ce qui n'était pas possible précédemment. En Java 2
on n'est plus limité aux curseurs par défaut et l'on peut en définir un à
partir d'une Image.

4.5 Comment récupérer les événements sur un Component a partir du JDK 1.1.x
?

En fait on peut distinguer plusieurs méthodes :

-> Première méthode, on ajoute explicitement un Listener a notre objet

Par exemple,

class MyListener implements ActionListener

 MyListener()
 {..}
 actionPerformed(ActionEvent e)
 {... faire quelque chose ...  }
 }

class MyApplication

 Button oneButton;
 MyApplication()
 

  oneButton = new Button();
  oneButton.addActionListener(new MyListener());
 }
}

Il existe d'autres types de Listener comme MouseListener, TextListener...

-> Deuxième méthode, notre objet dérive d'un objet existant, alors on
redéfinit des méthodes protégées existantes (dans l'objet de base). Sans
oublier de préciser que l'on veut recevoir de tels événements en utilisant
la méthode enableEvents().

Par exemple,

class MyButton extends Button

 MyButton()
 {...
  enableEvents(AWTEvent.ACTION_EVENT_MASK);
  // permet l'arrivee des evenements
 ...}
 // on redifinie processActionEvent
 protected processActionEvent(ActionEvent e)
 

  ...
  // pour permettre la transmission de l'evenement
  super.processActionEvent(e);
 }
}

4.6 Comment imprimer l'ensemble d'un Container (JDK 1.1.x) ?

Voilà un début de code permettant d'imprimer un Container 'cont' :

// récupère le travail et affiche la boite de dialogue d'impression
PrintJob job = getToolkit().getPrintJob(frame_parent_pour_le_dialogue,
     "essai", null);
if (job != null)
{
 // recupere le Graphics dans lequel on va ecrire
 Graphics g = job.getGraphics();
 if (g != null) {
  // sur le Container imprime l'ensemble de ses Components
  cont.printAll(g);
  g.dispose();
 }
 // finit le travail
 job.end();
}

4.7 Comment traiter les "double click" dans un mouseListener ?

Sur un événement de type MouseEvent, la méthode getClickCount() permet de
connaître le nombre de clicks et donc de gérer les doubles.

4.8 Comment connaître le bouton de souris concerné par un événement ?

Sur un événement de type InputMouseEvent, les  modifiers (getModifiers())
contiendront InputEvent.BUTTONx_MASK ou x correspond au bouton utilisé.

Par exemple pour tester si on appui sur le 3eme bouton (e = event) :

if ((e.getModifiers()&InputEvent.BUTTON3_MASK)!=0) {...}

Si l'on veut tester le fait que l'on soit sur le bouton devant déclencher un
menu contextuel (ce bouton peut différer selon la plate-forme) il faudra
tester :

if ((e.isPopupTriggered()) {...}

4.9 Je n'arrive pas a faire du cut/paste inter applications en JDK1.1.x ?

Dans cette version, ceci n'est possible qu'avec le stringFlavor et
plainTextFlavor pas encore avec les DataFlavor définis par l'utilisateur qui
ne fonctionneront qu'en intra application.

4.10 Comment lire une image dans une application puisque je ne dispose pas
de Applet.getImage(URL) ?

Il faut dans un premier temps récupérer le toolkit :

Toolkit tk = Toolkit.getToolkit();

Puis sur ce dernier lire le fichier :

Image im = tk.getImage("image.gif");

ou pour un chemin absolu par une URL :

Image im = tk.getImage(new URL("file:chemin/image.gif"));

4.11 Si cette image est dans un .jar lu par un application la solution si
dessus ne fonctionne pas.

Une manière générale de récupérer une ressource qui devrait fonctionner sur
une applet ou application dans un jar ou non est :

tk.getImage(getClass().getResource("chemin/nom.gif"));

Ainsi on laisse au ClassLoader la tache de chercher le fichier.

4.12 Comment faire en sorte que lors d'un double click de la souris l'action
sur le simple click ne soit pas exécutée ?

Tout d'abord généralement les actions simple et double click sont
complémentaires ( par exemple sélection d'une icône sur le simple click et
lancement de l'application correspondante sur le second click), il devrait
donc être rare d'avoir à rendre les 2 actions exclusives.

Si cela est vraiment nécessaire dans votre cas, il faudra sur la réception
de l'événement souris du premier click lancer un timer (objet Timer de Swing
ou votre propre objet [cf 8.3]) qui exécutera l'action associée seulement au
bout d'un temps supérieur a la durée d'un double click puis s'arrêtera de
lui-même. Si un second click de souris survient avant vous devez
naturellement stopper ce timer et effectuer l'action associée au second
click. La première action sera donc bien exécutée uniquement si le second
click n'arrive pas.

4.13 Comment récupérer la taille de l'écran ?

Tout simplement :

Toolkit.getDefaultTookit().getScreenSize()

4.14 Comment enregistrer une image ?

Java ne permet pas d'enregistrer un image au format GIF ou JPEG. Il va
falloir faire appel à des classes extérieures permettant le codage de
l'image.

En Java 2 qui ne fait pas partie des spécification de la plate-forme est
fournie pour enregistrer du JPEG :

http://java.sun.com/products/jdk/1.2/docs/guide/2d/api-jpeg/overview-
summary.html

Pour le GIF vous pouvez faire appel à :

http://www.acme.com/java/software/Acme.JPM.Encoders.GifEncoder.html

4.15 Qu'est ce que Java 2D ?

Java 2D est un extension de AWT apparu avec Java 2 est qui consiste
principalement en une classe dérivant de Graphics et permettant comprenant
des primitives de dessin plus evoluées que dans la classe de base (gradient
de couleurs, transparence, splines...).

4.16 Comment dessiner une Spline en Java ?

A moins de redéfinir soit même le dessin de la spline à l'aide de multiples
segments de droite, il faut attendre Java 2 et les Shape Java 2D pour
dessiner une spline. Les Shapes courbes sont : java.awt.geom.QuadCurve2D et
java.awt.geom.CubicCurve2D.

4.17 Après avoir appuyé sur un bouton ou choisi un menu pour exécuter une
action, mon interface est comme bloquée et ne se dessine plus ?

Suite au choix dans le menu ou à l'appui sur le bouton, Java est dans le
thread EDT ( Event Dispatcher Thread ), c'est le thread chargé de diffuser
les événements d'interface (souris, clavier, fenêtre, paint,...). Si ce
thread est monopolisé par une action, l'interface ne fonctionne plus et ne
se repeint plus. Ceci peut arriver si l'action est très longue à exécuter
( accès à une base de données par exemple ) ou si un sleep() est effectué
dans cette action.
La solution est alors de lancer l'action dans un autre thread. Lors du clic
sur le bouton ou sur le menu, il faut lancer un thread qui fera l'action, et
l'EDT sera alors relâché, l'affichage se fera !
 

5. CLASSES DE BASE (JAVA.UTIL.* JAVA.LANG.* JAVA.TEXT.*)

5.1 Quelle fonction permet de récupérer la valeur d'une variable
d'environnement ?

Il faut utiliser la méthode getProperty() de la classe System ainsi pour
récupérer la valeur de HOME par exemple :

System.getProperty("HOME") renvoie une String contenant la valeur désirée à
condition de lancer le programme ainsi : java -DHOME="xxx" nom_programme.
Pour correctement passer la variable d'environnement.

Par contre, les "propriétés systèmes" définies comme telles par java comme
par exemple "java.home" ou "os.name" ou encore "user.dir" sont accessibles
de cette manière sans passer par la définition avec le –D lors de l'appel.
La méthode renvoie directement la bonne valeur en faisant
System.getProperty("user.dir").

5.2 Comment transformer une String en entier ?

Deux principaux moyens existent :

 int i = Integer.parseInt(maString);
ou
 int i = Integer.valueOf(maString).intValue();
 (on cree un objet Integer pour le retransfromer en int)

On peut bien entendu appliquer ceci a d'autres types par exemple :

 long l = Long.parseLong(maString);

5.3 Qu'est ce que l'API de reflexion (Java Core Reflection API) ?
(Comment créer une instance d'une classe dont on connaît le nom)

C'est un package qui permet de travailler sur les attributs, méthodes et
constructeurs de classes "chargées". Elle permet par exemple de construire
"dynamiquement" un nouvel objet (ou même tableau) ou encore d'accéder a ses
attributs et méthodes.

Par exemple pour créer un objet à partir du nom d'une classe et transmettre
des arguments a son constructeur (exceptions a traiter) :

java.lang.Class cs = java.lang.Class.forName("nom_de_ma_classe");
java.lang.reflect.Constructor cr = cs.getConstructor();
java.lang.Object ot = cr.newInstance();

5.4 Comment calculer le cosinus ou sinus d'un nombre ?

java.lang.Math.cos(double) retourne le cosinus
et java.lang.Math.sin(double) le sinus

D'autres fonctions trigonométriques et mathématiques sont disponibles dans
cette class Math sous forme de méthodes statiques.

5.5 Comment rediriger ce qui est envoyé sur la sortie standard (System.out)
?

Utiliser tout simplement : System.setOut(PrintStream), le PrintStream étant
par exemple connecté à un fichier. Ceci est bien entendu aussi possible avec
System.err et System.in.

5.6 Comment connaître l'heure courante (JDK1.1.x) ?

Tout d'abord, il faut récupérer une instance de la classe Calendar :

Calendar cal = Calendar.getInstance();
ou si l'on veut preciser une zone horaire (ici Europe Central Time)
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("ECT"));

Ensuite sur cet objet on peut récupérer l'heure, les minutes ...

cal.get(Calendar.HOUR);
cal.get(Calendar.MINUTES);
cal.get(Calendar.DAY_OF_YEAR); //... voir java.util.Calendar

Ou afficher un résultat formaté :

System.out.println(DateFormat.getDateInstance(DateFormat.LONG).
      format(cal.getTime());

On peut ici aussi explicitement dire au format sous quelle TimeZone afficher
les résultats en faisant un setTimeZone() dessus. A la construction on peut
également lui préciser la langue à utiliser en précisant une Locale.

5.7 Comment formatter un nombre pour avoir par exemple 2 chiffres après la
virgule ?

DecimalFormat df = new DecimalFormat("########.00");
System.out.println(df.format(mon_nombre));

5.8 Comment découper une chaîne (String) en morceaux ?

Il faut utiliser un objet java.util.StringTokenizer qui permet aisément de
découper une chaîne en sous-chaines séparées par des délimiteurs que l'on
peut préciser.

5.9 Comment transformer une chaîne en float et inversement ?

La méthode est différente de celle des entiers. Pour créer une chaîne il
faut par exemple faire :

String machaine = Float.toString(monfloat);

Et dans l'autre sens :

float monfloat = Float.valueOf(machaine).floatValue();

La même chose est valable pour les double/Double.
 
 

6. JDBC (JAVA.SQL.*)

6.1 Comment effectuer une requete sur une base de donnees ?

Supposons que le driver JDBC de votre gestionnaire implémente
java.sql.Driver à travers une classe  boite.sql.myDriver. Alors pour
effectuer par exemple un SELECT, on peut procéder ainsi :
 

try

 // charge la classe driver
 Class.forName(boite.sql.myDriver);
} catch (java.lang.ClassNotFoundException e)  {}

// mon_protocole peut-etre msql, odbc (attention syntaxe
// speciale dans odbc pour la suite du protocole))
String url = "jdbc:mon_protocole://ma_machine:mon_port/ma_base";
try

 Connection con =
 DriverManager.getConnection(url,"mon_log", "mon_pass");
 // un statement ne peut servir pour une seule requete a la fois
 Statement smt = con.createStatement();
 // exemple : peut etre remplace par toute autre requete
 ResultSet result = executeQuery(SELECT * FROM TEST);
 // result est un "tableau" contenant le resultat de la requete

 // voir la doc pour les méthodes permettant de l'analyser
 // par exemple si la base est forme d'un INT et d'un REAL
 // tant qu'il reste des lignes a lire on fait :
 while (result.next())
 

  int a = result.getInt(1); // premiere element
  float x = result.getFloat(2); file://deuxieme element
  // on peut aussi mettre une String :
  // getFloat("nom_de_la_colonne");
  // traitements ...
 }
 smt.close();
 con.close();
}
catch (java.sql.SQLException e) {}

6.2 Comment récupérer le nom d'une colonne par exemple ?

En gardant la connexion mise en  place précédemment, pour accéder aux types
et propriétés des colonnes on utilise un objet de type ResultSetMetaData
obtenu ainsi :

 ResultSetMetaData rsm = result.getMetaData();

Puis par exemple pour connaître le nom de la colonne 1 :

 String str = rsm.getColumnName(1)

On peut aussi en connaître le type :

 String str = rsm.getColumnTypeName(1)

et autres méthodes bien pratiques...

6.3 Mon driver JDBC ne fonctionne pas au sein d'une Applet ?

Au sein d'une Applet, seul les drivers de type III et IV fonctionnent
correctement.

Pour plus de précisions sur les types de drivers vous trouverez sur le site
de Sun :

http://java.sun.com/products/jdbc/jdbc.drivers.html
 
 

7. LES APPLETS (JAVA.APPLET.* ET JAVA.NET.*)

7.1 Certaines méthodes du JDK me demandent une Frame, mais Applet ne
dérivant pas de Frame que passer en argument ?

Une solution semble exister au moins avec Netscape Navigator et
Appletviewer, en effet ils placent les applets  dans une Frame. Il suffit
donc d'utiliser getParent() sur l'Applet pour récupérer cette Frame et s'en
servir ( éventuellement de manière récursive jusqu'à récupérer la Frame ).

7.2 Comment dans une applet afficher une nouvelle page HTML dont on connaît
l'adresse ?

Il faut dans l'applet, récupérer la page puis l'afficher, ceci peut être
effectué suite a l'appui sur un bouton ou autre.

URL recup;
try

 // récupère l'URL a partir du document courant et "page.html"
 recup = new URL(getDocumentBase(), "page.html");
 // Affiche le document apres avoir recupere le contexte courant
 getAppletContext().showDocument(recup, option_frame);
 repaint();
} catch (MalformedURLException e)

 // un traitement quelconque si la page n'est pas correcte
}

option_frame peut-être :
 "_self" -> la frame courant
 "_parent" -> la frame parente
 "_top" -> la frame de base
 "_blank" -> nouvelle fenetre
 "un_nom" -> nouvelle fenetre nommee.

7.3 Comment récupérer des arguments d'une page HTML dans une applet ?

à l'intérieur de la page HTML l'appel se fait ainsi :

<applet code=mon_code>
 <param name=param1 value="xxx">
 <param name=param2 value="yyy">
</applet>
 

dans l'applet on récupère les résultats ainsi :

String param1 = getParameter("param1");
String param2 = getParameter("param2");

7.4 Comment afficher quelque chose dans la barre de status d'un navigateur ?

Il faut utiliser la méthode showStatus(String) sur un objet de type
java.applet.AppletContext.

7.5 Comment récupérer le source html de la page web sur laquelle on se
trouve ?

-> première méthode sur l'applet :

String ligne;
try {
 InputStream is = getDocumentBase().openStream();
 BufferedReader bf = new BufferedReader(new InputStreamReader(is));
 while (ligne = bf.getLine())
 {
  // on lit ligne par ligne...
 }
}
catch (IOException e) {...}

-> seconde méthode plus complexe mais sûrement plus puissante :

Il s'agit ici de créer une "content handler factory" qui  créera des objets
Java  en fonction du type mime du document. Ainsi la méthode
java.net.URL.getContent() retournera automatique l'objet correspondant au
type de document pointé par l'URL.

7.6 Comment faire communiquer deux Applets ?

Deux cas se présentent :

-> Les Applets se trouvent dans la même frame HTML.

Alors il suffit de récupérer une Applet a partir d'une autre de cette
manière :

CType autre_applet = (CType)(getAppletContext().getApplet("tagname");

il faut que l'autre applet ait été déclarée dans le code HTML de la sorte :

<applet code=.... name="tagname"></applet>
 

-> Si les Applets sont déclarées dans des frames HTML différentes.

Comme le navigateur utilise généralement une seule JVM, l'espace mémoire est
partagé. Une astuce est donc alors de créer une classe ne contenant que des
membres statiques et permettant l'enregistrement et la récupération
d'Applet. Ces membres statiques seront uniques en mémoire et donc partagés
entre les applets.

Un début de structure serait :

class AppletDataBase
{
 // une structure de donnée permettant d'enregistrer les donnees
 static Hashtable data;
 // un methode permettant de recuperer une Applet grace a son tag
 public static Applet getApplet(String tag);
 // un methode chargee d'enregistrer une Applet marquee par un tag
 public static void addApplet(Applet applet, String tag);
}

dans les Applets on peut ainsi faire l'équivalent de ce qui est fait avec
l'AppletContext :

Applet autre_applet = AppletDataBase.getApplet("tagname");

7.7 Mon applet ne marche pas avec un plugin java que faire ?

En fait pour faire marcher votre applet avec un plugin, il va falloir
modifier le contenu de votre page html. Ceci dépendant de votre naviguateur.
Vous trouverez plus d'informations à l'adresse suivante :

http://www.javasoft.com/products/plugin/1.1.1/docs/tags.html
 
 

8. LES JAVA FOUNDATION CLASSES (JFC : JAVAX.SWING.* ET
JAVA.AWT.DND.* )

8.1 Qu'est que les JFC et Swing ?

Le JFC sont un certain nombre de packages principalement graphiques étendant
les packages de base standard présents dans le JDK1.1. Les JFC sont
intégrées au JDK 1.2 et supérieurs (Java 2).

Vous pouvez télécharger Swing pour le JDK1.1.x sur le site Sun [Cf 12.2]

Elles sont formées de classes pure java dénommées Swing mais aussi de
nouvelles extensions comme le drag'n'drop par exemple qui sont dépendantes
de la plate-forme.

8.2 Des problèmes graphiques apparaissent lorsque j'utilise Swing ?

Ce problème peut avoir principalement deux origines :

Les composants swing sont lightweight et vont donc dans certains cas
s'afficher derrière les composants du système qui sont heavyweight et ont
priorité ( il s'agit des composants AWT en l'occurrence ).

Pour plus de détails sur les différents problèmes observés et pour vous
aider a les résoudre il est intéressant de consulter :

http://java.sun.com/products/jfc/tsc/archive/tech_topics_arch/mixing/mixing.
html

Une deuxième source d'erreur est le fait d'utiliser Swing dans un
environnement multithread. En effet Swing dès lors que vous avez appelé
setVisible(true) sur la fenêtre principale requiers que vous faisiez appel à
ses méthodes uniquement dans le thread de gestion de événements. C'est-à-
dire dans un listener.

Pour plus de détail à ce sujet, il est intéressant de lire :

http://java.sun.com/products/jfc/tsc/archive/tech_topics_arch/threads/thread
s.html

8.3 Existe il un objet gérant les timers en java ?

Dans l'API de base il n'existe pas de tel objet, par contre Swing possède un
objet Timer qui permet d'exécuter des méthodes a intervalle régulier.

En dehors de Swing vous pouvez vous créer relativement simplement un tel
objet avec les Thread et la méthode Thread.sleep(). L'objet Timer de Swing
est lui un peu plus complexe et est géré avec un système de notification
(notify/wait).

Voici un exemple trés simple si vous n'avez pas Swing :

class Timer extends Thread
{
 private int _delay;
 private TimerListener _listener;
 public Timer(int delay, TimerListener listener) {
  _delay = delay;
  _listener = listener;
}
 public void run()
 {
  try {
   sleep(_delay); }
  catch (Exception ex) { ex.printStackTrace());}
  _listener.executedMethod();
 }
}

interface TimerListener
{
 public abstract void executedMethod();
}

// création du timer :
Timer timer = new Timer(500, new TimerListener() {
 public void executedMethod() {
  System.out.println("coucou");
 }
});
// lancement
timer.start();

8.4 Comment afficher une info bulle ( Tooltip ) ?

En Swing, il suffit d'utiliser un JToolTip, en spécifiant le texte désiré
sur votre JComponent avec la méthode JComponent.setToolTipText().
En dehors de Swing la seule alternative est de gérer vous même l'affichage
d'une Window à travers un listener écoutant l'entrée et la sortie du
pointeur souris des composants.

8.5 Comment afficher du HTML dans un composant Swing ?

En utilisant un JEditorPane :

JEditorPane html = new JEditorPane();
html.setEditable(false);
html.setPage(un_objet_URL);

8.6 Comment traduire le JFileChooser ou le JColorChooser en français ?

Ces boîtes de dialogue ne suivent pas la locale de votre système. En fait
chaque texte affiché dans ces boîtes de dialogue correspond à une ressource
du UIManager. Il va donc falloir changer ces ressources.

Par exemple pour le JFileChooser vous pouvez dans votre code faire :

UIManager.put("FileChooser.saveButtonText","Enregistrer");
UIManager.put("FileChooser.openButtonText","Ouvrir");
UIManager.put("FileChooser.cancelButtonText","Annuler");
UIManager.put("FileChooser.updateButtonText","Actualiser");
UIManager.put("FileChooser.helpButtonText","Aide");
UIManager.put("FileChooser.saveButtonToolTipText","Enregistre le fichier");
 

Ce genre de propriétés ne sont souvent pas documentés et vous devrez les
trouver vous même [cf 8.6].

8.7 Où trouver les propriétés à passer au UIManager (UIManager.put()) ou aux
objets (JComponent.putClientProperty()) ?

Il n'y a pas de documentation exhaustive de ces ressources. Cependant vous
pouvez vous débrouiller ainsi :
Concernant les ressources du UIManager vous pouvez jeter un coup d'śil au
cite suivant qui en comparant les différents Look & Feel décrit les valeurs
des ressources

http://www.gargoylesoftware.com/papers/plafdiff.html

Concernant les propriété cliente des JComponent vous trouverez de
informations notamment :

http://java.sun.com/products/jfc/tsc/special_report/performance/performance.
html

Cette page décrit une ou deux propriétés clientes concernant la performance
des objets en Swing-1.1.1.

On peut trouver certaines informations dans la documentation des UIComponent
correspondant aux JComponent (javax.swing.plaf.*) par exemple pour le JTree
en look Metal :

http://java.sun.com/products/jdk/1.2/docs/api/javax/swing/plaf/metal/MetalTr
eeUI.html

Le livre : Java Look and Feel Design Guidelines contient des informations
pour le look Metal. Une version en ligne est maintenant disponible :

http://java.sun.com/products/jlf/dg/index.htm

Concernant aussi bien les ressource UIManager que les propriétés clientes,
la liste exhaustive vient en examinant le code source de Swing...

8.8 Peut-on rendre les JTooltip multi-lignes ?

Par défaut les JTooltip ne savent afficher qu'une seule ligne, il faut
étendre la classe pour afficher plusieurs lignes. Voir un exemple sur :

http://www.codeguru.com/java/articles/122.shtml

8.9 Comment mélanger un JTree Swing et une JTable ?

Il faut s'inspirer de l'exemple suivant qui permet de visualiser le contenu
d'un répertoire :

http://java.sun.com/products/jfc/tsc/articles/treetable2/index.html

8.10 Que faut-il faire pour avoir un JTextField n'acceptant que des chiffres
?

Il faut redéfinir un Document qui n'accepte que des chiffres. Un autre
avantage est que ce document pourra resservir dans d'autres objets
( JTextField, JTextArea... ). Si dessous un exemple :
 

// example de redefinition d'un document
private static class NumberDocument
extends PlainDocument
{
// est-ce qu'on peut rentrer un flotant => '.' sera accepte
private boolean isFloat;
// est-ce qu'on peut rentrer un negatif => '-' sera accepte
private boolean acceptNeg;

public NumberDocument(boolean isFloat, boolean acceptNeg)
{
this.isFloat = isFloat;
this.acceptNeg = acceptNeg;
}

public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException
{
if (str == null)
return;
char[] first = str.toCharArray();
StringBuffer buff = new StringBuffer();
int i = 0;
if (offs == 0 && acceptNeg && first[0] == '-')
buff.append(first[i++]);
for (; i < first.length; i++)
if(Character.isDigit(first[i])||(isFloat && first[i]=='.'))
buff.append(first[i]);
super.insertString(offs, buff.toString(), a);
}
}

// exemple d'utilisation
JTextField field = new JTextField(new NumberDocument(false, false),"23", 2);
 
 

9. JAVA ET LE RESEAU (JAVA.NET.* JAVA.RMI.* ORG.OMG.CORBA.*)

9.1 Comment savoir si une connexion Socket est toujours établie ?

Lorsque la connexion est coupée, une IOException est levée lors de tout
appel à n'importe quelle méthode de la classe Socket ( coté client ) ou
ServerSocket ( coté serveur ). Il faut donc bien attraper cette exception.
 
 

10. LES AUTRES PACKAGES OU OUTILS

10.1 Apache supporte-t-il les servlets ?

Non, par contre il existe un extension à Apache nommée JServ qui gère les
Servlets :

http://java.apache.org/jserv/index.html

10.2 Comment accéder au registre de Windows avec Java ?

Par exemple en utilisant une API native comme :

http://www.ice.com/java/jnireg/index.shtml

10.3 Comment supprimer d'une archive jar les fichiers inutiles à l'exécution
d'une application ou applet ?

Le plus simple est d'utiliser un outil qui cherchera pour vous les
classes/méthodes non utilisées et les supprimera en réduisant ainsi la
taille de l'archive jar.
On peut par exemple cité Dash-O de Preemptive Software :

http://www.preemptive.com/
 

11. JAVA ET ...

11.1 Java et C/C++

En C/C++ vous ne pouvez pas directement appeler du code java puisque celui-
ci est un code a interprété. En JDK 1.0.x le seul moyen 'un peu lourd' était
de faire un system("java ma_classe");  qui devrait fonctionner.

Cependant en JDK 1.1.x, la JNI ( Java Native Interface ) permet à travers
l'API d'invocation (Invocation API) de faire  appel a la VM à partir d'un
code C/C++ et donc d'invoquer du code Java.

Réciproquement, en Java vous pouvez utiliser les méthodes "natives" qui vous
permettent de faire appel a du code C/C++ sous forme de librairie.  La
démarche à suivre est la suivante :

 -> Création du source java avec pour les  méthodes qui viendront de
  C/C++ juste leur déclaration sous cette forme :
  public native type_retour ma_fonction(argument) ;

 -> Ajouter un constructeur de classe qui chargera la librairie C :
  static {
   System.loadLibrary("nom_librarie");
  }

 -> Compilation du source java

 -> Traitement avec javah : javah ma_classe qui renvoie un header
  (fichier .h) contenant la déclaration de nos fonctions C et un
  fichier .c qui "gère" le dialogue avec Java.

 -> Créer le fichier source C correspondant a l'implémentation des
  fonctions du header (voir la doc du JDK).

 -> Compiler le  fichier C et le mettre sous forme de librairie
  cette étape est différente selon les systèmes ( a vous de
voir ).

 -> Essayer !

11.2 Java et JAVASCRIPT

Java est un langage oriente objet, il peut être utilisé aussi bien à travers
le Web que comme langage applicatif. JavaScript est un langage non objet qui
peut être intégré aux scripts HTML pour étendre leurs possibilités.

Attention JavaScript ne fait en aucun cas partie de la norme HTML. De plus,
il permet évidemment de faire beaucoup moins de choses que Java. Il n'est
pas réaliste de réaliser des applications entière avec par exemple.

11.3 Applet Java et CGI/BIN

La principale différence est que l'Applet  s'exécute sur le client alors que
le script CGI/BIN est exécuté lui sur le serveur.

L'applet est écrite en JAVA. Elle travaille directement dans la fenêtre du
navigateur ou dans ses propres fenêtres.

Le script CGI/BIN peut lui être écrit à priori dans n'importe quel langage.
Il prend les données de la page HTML en entrée standard et renvoie du code
HTML sur sa sortie standard.

11.4 Java et l'Euro !

Le caractère UNICODE correspondant à l'Euro est : 0x20AC.

C'est à dire que vous devez écrire :

System.err.print("Maintenant les prix sont en u\20AC");

11.5 Java et XML.

Pour l'instant Java ne possède pas d'API permettant de lire/écrire du XML.
Cependant Sun et IBM propose en pré-version de telles API. Voir les URLs
suivantes :

IBM propose également un afficheur de SVG (SVG décrit du graphique en XML).
 
 

12. QUESTIONS SUR LES RESSOURCES

12.1 Où trouver les Java Foundation Classes 1.1.1 (Swing) ?
 http://www.javasoft.com/products/jfc/index.html

12.2 Où se procurer des pré-versions des nouvelles API de Sun ?
 http://developer.javasoft.com
 à noter qu'une inscription libre est nécessaire pour accéder à ce
site.

12.3 Sites spécialisés dans le portage de la machine ou d'un IDE sur un OS ?
 Linux : http://www.blackdown.org/java-linux.html
 w95/Solaris : http://java.sun.com ou http://www.javasoft.com
 w95/NT : http://cafe.symantec.com ( bientôt chez BEA )
 w95/NT : http://www.microsoft.com/java
 w95/NT/Linux/Solaris : http://www.borland.fr/produits/jbuilder/
 OS/2 AIX : http://www.ibm.com/Java
 IRIX : http://www.sgi.com/developers/devtools/languages/java.html
 HP/UX : http://www.hp.com/esy/go/java.html
 MacOS : http://www.apple.com/macos/java/
 MacOS : http://www.metrowerks.com/

 pour plusieurs type de plate-forme :
 http://www.kaffe.org

 et encore plus de choix à :
 http://java.sun.com/cgi-bin/java-ports.cgi

12.4 Où trouver la liste des différents caractères UNICODE ?
 ftp://ftp.unicode.org/Public/

12.5 Où trouver un driver JDBC pour Msql ?
 http://www.imaginary.com/

12.6 Où trouver un driver JDBC pour Oracle ?
 http://www.oracle.com/products/free_software/index.html

12.7 Où trouver un driver JDBC pour Interbase ?
 http://www.interbase.com

12.8 Où trouver la liste des drivers JDBC connus ?
 http://java.sun.com/products/jdbc/jdbc.drivers.html

12.9 Classes permettant de traiter des collections d'objets ?
 http://gee.cs.oswego.edu/dl/classes/collections/index.html
 ces packages sont inclus dans le JDK1.2

12.10 Existe-t-il un serveur HTTP ecrit en Java ?
 http://www.w3c.org/jigsaw

 Mais aussi de chez JavaSoft Java Web Server 1.1
 http://www.javasoft.com

 C'est deux serveur supportent les Servlets.

12.11 Où trouver d'autre Layout Managers que ceux de AWT ?
 http://www.softbear.com/people/larry/javalm.htm

12.12 Existe-t-il des alternatives à AWT ?
 Concernant les gadgets, Swing est bien entendu un remplaçant de choix.
 

12.13 Existe-t-il des sites JAVA en français ?
 http://www.eerie.fr/~javateam
 http://cuiwww.unige.ch/java

12.14 Existe-t-il des décompilateurs de byte code ?
 par exemple Mocha et son "antidote" Crema.
 voir aussi http://www.meurrens.org/ip-Links/java/codeEngineering

12.15 Où peut-on trouver un client RPC en Java ?
 http://www.distinct.com

12.16 Où trouver des codes lisp pour un mode Java sous Emacs ?
 http://eclia5.ec-lille.fr/~bouts/java-emacs.eng.html
 autrement un environnement très complet est le jde :
 http://sunsite.auc.dk/jde/

12.17 Existe-t-il une mailing list sur java en francais ?
 java@u-strasbg.fr

12.18 Existe-t-il une mailing list sur java et corba ?
 JavaCORBA@luke.org

12.19 Où trouver des informations concernant les applets signées ?
 http://java.sun.com/docs/books/tutorial/security1.1
 http://www.suitable.com/Doc_CodeSigning.shtml

12.20 Existe-t-il un equivalent a Lex et Yacc en Java ?
 http://www.suntest.com/JavaCC
 http://www.antlr.com/

12.21 Où trouver Thinking In Java (le pdf) :
 http://www.bruceeckel.com/

12.22 Existe-t-il des classes permettant de gérer le port série et parallèle
?
 http://java.sun.com/products/javacomm

12.23 Existe-t-il un package permettant de gérer les expressions régulières
?
 http://www.meurrens.org/ip-Links/java/regex

12.24 Existe-t-il d'autre debugger que jdb ?
 Oui, par exemple :
 http://www.jwatch.com

12.25 Existe-t-il un package pour gérer l'envoi de mail ?
 http://java.sun.com/products/javamail/index.html

12.26 Où trouver des informations sur JSP ?
 http://www.caucho.com/misc/jsp-faq.html

12.27 Où trouver des informations sur les servlets ?
 Il existe un FAQ en anglais :
 http://www.purpletech.com/java/servlet-faq/

12.28 Je m'intéresse à l'obfuscation, où trouver des informations ?
http://www.cs.arizona.edu/~collberg/Research/Obfuscation/index.html
 
 

From - Sat Mar 10 00:14:21 2001
Path: nnrp3.proxad.net!feeder2.proxad.net!proxad.net!fr.usenet-edu.net!usenet-edu.net!freenix!fr-chartes!maintfaq
From: christophe.jolif@wanadoo.fr (Christophe Jolif)
Newsgroups: fr.comp.lang.java,fr.usenet.reponses
Subject: [FAQ] fr.comp.lang.java
Supersedes: <fr.comp.lang.faq-java-981002596.395898@ns2.freenix.org>
Followup-To: poster
Date: Fri, 16 Feb 2001 04:43:17 GMT
Approved: fr-reponses@frmug.org
Expires: Mon, 5 Mar 2001 04:43:17 GMT
Message-ID: <fr.comp.lang.faq-java-982298597.560398@ns2.freenix.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: 8bit
X-No-Productlink: yes
Lines: 1506
Xref: feeder2.proxad.net fr.comp.lang.java:36810 fr.usenet.reponses:9489

Archive-Name: fr/comp/lang/faq-java

FTP-Archive-Name: ftp://ftp.univ-lyon1.fr/pub/faq/by-name/fr/faq-java