Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Amateur] Applet simplissime a interface depouillee

4 réponses
Avatar
Jean-Luc Ancey
Bonjour. Je programme depuis assez longtemps (en amateur) en C,
Perl et Python, mais je suis assez béotien en Java. Histoire de
m'y mettre sans trop m'ennuyer, j'aimerais construire de petites
applets à l'interface hyper-dépouillée (en adaptant à Java
d'innombrables bidouilles que j'ai déjà programmées dans d'autres
langages). Mon cahier des charges serait le suivant:

- une zone graphique de 640 x 480 pixels;

- la capacité à afficher des traits droits et de brèves mentions
textuelles;

- la capacité à récupérer les coordonnées d'un clic;

- une case de saisie;

- et voilà, c'est à peu près tout... A la rigueur, les jours de
grand vent, j'aimerais bien un ou deux labels, un ou deux
boutons.

Je ne demande pas la lune, non? Cela dit, les grands anciens dans
mon genre se souviennent que quand AutoCAD est apparu (du temps
des PC-AT avec 512 Ko de mémoire et une carte Hercules), il ne
faisait rien de plus et ça paraissait déjà génial.

Bref. Pour faire ça, je me suis inspiré de ce que j'ai trouvé de
plus simple, à savoir ceci, rencontré sur le site de Sun:

http://java.sun.com/applets/jdk/1.4/index.html

Vous l'aurez remarqué, ça n'a pas été mis à jour depuis Java 1.4
-- et croyez bien que je le déplore, mais c'est quand même ce que
Sun indique de plus simple comme exemples.

J'en ai fait ceci, qui marche à peu près (ça ne sert à rien pour
le moment, mais déjà ça ne plante pas et ça n'est pas si mal de
mon point de vue):

http://jlancey.club.fr/test_applet/JlaApplet.html

Mais je soupçonne qu'il y a quelque chose que je n'ai pas fait
dans les règles de l'état actuel de l'art, car à la compilation
(avec javac versions 1.6.0_07, 1.6.0_03 et 1.5.0_13) j'obtiens
ceci en warning:

Note: JlaApplet.java uses or overrides a deprecated API.

JlaApplet.java:48: warning: [deprecation] show() in
java.awt.Window has been deprecated

maFrame.show(); ^ 1 warning

Ce qui, déjà, me chiffonne un tantinet... mais ce qui me
chiffonne carrément, c'est que je n'arrive à faire fonctionner
cette applet *dans une page web* qu'en la compilant sous
Mac OS X en 1.5.0_13 (sur mon MacBook avec processeur Intel
Core 2 Duo). Or, moi, je bosse normalement en 1.6.0_07 sous
Linux (sur la même machine avec donc le même processeur
64 bits, et une Ubuntu 7.10 AMD 64).

Soupçonnant que le processeur et l'architecture du Mac y étaient
peut-être pour quelque chose, j'ai essayé de compiler sur mon
eeePC à processeur 32 bits Intel Mobile (et avec une eeeXubuntu
7.10.3)... Cette fois, mon javac a pour numéro de version
1.6.0_03. Ben ça ne marche pas non plus.

Pourtant, les warnings sont les mêmes dans les trois cas... et
dans les trois cas, l'applet fonctionne sans aucun problème avec
appletviewer.

Quelqu'un aurait une idée? une piste? de meilleurs exemples à
m'indiquer?

Comme ce n'est pas bien long, je balance carrément le code
ci-dessous à l'intention des curieux. Tout avis compétent sera le
bienvenu, mais ne visez pas trop haut, hein: en dehors des... 886
pages de mon manuel, j'y connais pas grand-chose, moi. Et
l'honnêteté m'oblige à signaler que ledit manuel ne représente
sûrement pas le dernier état de l'art, vu que je l'ai acheté en
1999 ("Le développeur Java 2" d'Antoine Mirecourt, chez Osman
Eyrolles Multimédia). Ben oui, que voulez-vous, c'est long à lire
et surtout à comprendre, 886 pages de code -- et par ailleurs ça
m'avait coûté 240 F, alors j'essaie d'amortir.

Merci d'avance! :-)

--
Jean-Luc Ancey - jlancey[at]nospam.rocketmail.com
(ça marchera mieux avec @ et en virant "nospam.")
http://www.amarelia.org

=================================

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class JlaApplet extends Applet {
JlaControls mesCtrls; // La barre au bas de l'ecran
JlaCanvas monCanvas; // La zone de dessin

public void init () {
setLayout(new BorderLayout());
monCanvas = new JlaCanvas();
mesCtrls = new JlaControls(monCanvas);
monCanvas.setControls(mesCtrls);
add("Center", monCanvas);
add("South", mesCtrls);
}

public void destroy () {
remove(mesCtrls);
remove(monCanvas);
}

public void start () {
mesCtrls.setEnabled(true);
}

public void stop () {
mesCtrls.setEnabled(false);
}

public void processEvent (AWTEvent eveAwt) {
if (eveAwt.getID() == Event.WINDOW_DESTROY) {
System.exit(0);
}
}

public static void main (String args[]) {
// La presence d'une methode main permet de compiler l'applet
// comme un programme independant. Et en plus, ca marche.
Frame maFrame = new Frame("ArcTest");
JlaApplet monApplet = new JlaApplet();

monApplet.init();
monApplet.start();

maFrame.add("Center", monApplet);
maFrame.setSize(300, 300);
maFrame.show();
}

public String getAppletInfo () {
return "Cette applet a ete ecrite par Jean-Luc Ancey a partir
d'un exemple de Sun.";
}
}

class JlaCanvas extends Canvas {
Font font;
Color couleurContour = new Color(0, 0, 255);
int xClic = 52;
int yClic = 52;
final JlaCanvas moiLeCanvas = this;
JlaControls mesCtrls; // La barre au bas de l'ecran

public JlaCanvas () {
super();

this.addMouseListener(
new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
xClic = e.getX();
yClic = e.getY();
metAJourLabel();
moiLeCanvas.repaint();
}
public void mousePressed(MouseEvent e) {
// Pour les mal-comprenants
// qui cliquent en bougeant la souris
xClic = e.getX();
yClic = e.getY();
metAJourLabel();
moiLeCanvas.repaint();
}
}
);
}

public void paint (Graphics monGraphique) {
Rectangle monRect = getBounds();

// Affiche de petits messages dans la partie graphique
int xTexte = 10;
int yTexte = monRect.height - 28;
monGraphique.drawString("xClic = " + xClic, xTexte, yTexte);
monGraphique.drawString("yClic = " + yClic, xTexte, yTexte + 14);

// Dessine une croix a l'endroit clique
monGraphique.setColor(couleurContour);
monGraphique.drawLine(xClic - 5, yClic, xClic + 5, yClic);
monGraphique.drawLine(xClic, yClic - 5, xClic, yClic + 5);
}

public void redraw (JlaControls mesCtrls) {
metAJourLabel();
repaint();
}

public void metAJourLabel () {
// Indication des coord du clic de souris sur le label
StringBuffer blabla = new StringBuffer("");
blabla.append(new Integer(xClic).toString());
blabla.append(" ");
blabla.append(new Integer(yClic).toString());
String texteLabel = new String(blabla);
mesCtrls.monLabel.setText(texteLabel);
}

public void setControls (JlaControls mesCtrls) {
this.mesCtrls = mesCtrls;
}
}

class JlaControls extends Panel implements ActionListener {
JlaCanvas monCanvas;
Button bouton = new Button("Reinitialiser");
Label monLabel = new Label("Coucou!");
TextField startTextField = new TextField("", 20);

public JlaControls (JlaCanvas monCanvas) {
this.monCanvas = monCanvas;

bouton.addActionListener(this);

add(bouton);
add(monLabel);
add(startTextField);
}

public void actionPerformed (ActionEvent evenement) {
// String commande = evenement.getActionCommand();

monCanvas.redraw(this);
}
}

4 réponses

Avatar
Jean-Claude Arbaut
Jean-Luc Ancey wrote:
Bonjour. Je programme depuis assez longtemps (en amateur) en C,
Perl et Python, mais je suis assez béotien en Java. Histoire de
m'y mettre sans trop m'ennuyer, j'aimerais construire de petites
applets à l'interface hyper-dépouillée (en adaptant à Java
d'innombrables bidouilles que j'ai déjà programmées dans d'autres
langages). Mon cahier des charges serait le suivant:

- une zone graphique de 640 x 480 pixels;

- la capacité à afficher des traits droits et de brèves mentions
textuelles;

- la capacité à récupérer les coordonnées d'un clic;

- une case de saisie;

- et voilà, c'est à peu près tout... A la rigueur, les jours de
grand vent, j'aimerais bien un ou deux labels, un ou deux
boutons.

Je ne demande pas la lune, non? Cela dit, les grands anciens dans
mon genre se souviennent que quand AutoCAD est apparu (du temps
des PC-AT avec 512 Ko de mémoire et une carte Hercules), il ne
faisait rien de plus et ça paraissait déjà génial.

Bref. Pour faire ça, je me suis inspiré de ce que j'ai trouvé de
plus simple, à savoir ceci, rencontré sur le site de Sun:

http://java.sun.com/applets/jdk/1.4/index.html

Vous l'aurez remarqué, ça n'a pas été mis à jour depuis Java 1.4
-- et croyez bien que je le déplore, mais c'est quand même ce que
Sun indique de plus simple comme exemples.

J'en ai fait ceci, qui marche à peu près (ça ne sert à rien pour
le moment, mais déjà ça ne plante pas et ça n'est pas si mal de
mon point de vue):

http://jlancey.club.fr/test_applet/JlaApplet.html

Mais je soupçonne qu'il y a quelque chose que je n'ai pas fait
dans les règles de l'état actuel de l'art, car à la compilation
(avec javac versions 1.6.0_07, 1.6.0_03 et 1.5.0_13) j'obtiens
ceci en warning:

Note: JlaApplet.java uses or overrides a deprecated API.

JlaApplet.java:48: warning: [deprecation] show() in
java.awt.Window has been deprecated

maFrame.show(); ^ 1 warning



oui, show() doit être remplacé par setVisible(true)
C'est un détail :-)

Ce qui, déjà, me chiffonne un tantinet... mais ce qui me
chiffonne carrément, c'est que je n'arrive à faire fonctionner
cette applet *dans une page web* qu'en la compilant sous
Mac OS X en 1.5.0_13 (sur mon MacBook avec processeur Intel
Core 2 Duo). Or, moi, je bosse normalement en 1.6.0_07 sous
Linux (sur la même machine avec donc le même processeur
64 bits, et une Ubuntu 7.10 AMD 64).



Les fichiers .class ne dépendent pas du processeur,
donc ça ne vient pas de là ;-)

Soupçonnant que le processeur et l'architecture du Mac y étaient
peut-être pour quelque chose, j'ai essayé de compiler sur mon
eeePC à processeur 32 bits Intel Mobile (et avec une eeeXubuntu
7.10.3)... Cette fois, mon javac a pour numéro de version
1.6.0_03. Ben ça ne marche pas non plus.

Pourtant, les warnings sont les mêmes dans les trois cas... et
dans les trois cas, l'applet fonctionne sans aucun problème avec
appletviewer.



Sans être expert en applettes, je dirais que c'est un problème du
plugin java de ton navigateur : normal que ça marche sous OSX
et (je suppose) Safari, car java est installé par défaut, et
configuré pour le web. Sous Linux ça doit être un peu plus
délicat à faire marcher. Mais je ne vais pas pouvoir t'aider,
je n'ai jamais essayé : tu peux tenter ta chance sur les
forums ubuntu, ils sont très bons en général (pê même que
quelqu'un a déjà posté là dessus)
(ce qui me fait dire que c'est ça, c'est que ça marche avec
appletviewer, qui réalise la même chose *sauf* qu'il ne passe
pas par le navigateur)

La seule chose à propos de compilation qui pourrait te poser
des problèmes parfois, puisque tu as deux versions
de java différentes : en général une classe compilée avec java "x"
ne sera pas exécutable avec java "y" si x>y (sauf que les
sous-versions sont bien sûr compatibles entre elles).
Avatar
Jean-Luc Ancey
Jean-Claude Arbaut a écrit :

show() doit être remplacé par setVisible(true)
C'est un détail :-)



Mais qui a son importance... car une fois que c'est
corrigé, non seulement je n'ai plus le warning, mais
surtout ça marche!

Les fichiers .class ne dépendent pas du processeur,
donc ça ne vient pas de là ;-)



Je me disais bien, aussi...

Sans être expert en applettes, je dirais que c'est un problème du
plugin java de ton navigateur : normal que ça marche sous OSX
et (je suppose) Safari, car java est installé par défaut, et
configuré pour le web.



Oui... Mais en 1.5. :-(

> Sous Linux ça doit être un peu plus
délicat à faire marcher.



C'est vrai... Je fais les tests avec la Xubuntu de mon eeePC,
tant pis pour l'Ubuntu de mon Mac (qui, cela dit, compile
très bien maintenant que j'ai viré show).

La seule chose à propos de compilation qui pourrait te poser
des problèmes parfois, puisque tu as deux versions
de java différentes : en général une classe compilée avec java "x"
ne sera pas exécutable avec java "y" si x>y (sauf que les
sous-versions sont bien sûr compatibles entre elles).



Oui, c'est bien ça. J'en conclus que je peux travailler
à mes bazars en 1.6, et même avec l'Ubuntu de mon Mac,
mais qui si je veux vraiment mettre ça sur le web j'ai
intérêt à compiler en 1.5. Ce n'est pas très satisfaisant
pour l'esprit mais je m'en contenterai.

Merci de ton aide précieuse! :-)

--------------------------------------
Jean-Luc Ancey - jlancey[at]nospam.com
(Ca marchera mieux en mettant "rocketmail" à la place de "nospam")
http://www.amarelia.org
--------------------------------------
Avatar
Sylvain SF
Jean-Luc Ancey wrote on 12/09/2008 20:59:

Mon cahier des charges serait le suivant: - une zone graphique de
640 x 480 pixels; - la capacité à afficher des traits droits et de
brèves mentions textuelles; - la capacité à récupérer les
coordonnées d'un clic; - une case de saisie;





Bref. Pour faire ça, je me suis inspiré de ce que j'ai trouvé de
plus simple, à savoir ceci, rencontré sur le site de Sun: Vous
l'aurez remarqué, ça n'a pas été mis à jour depuis Java 1.4





vous demandez quelque chose simple mais regrettez le manque de mise
à jour ?! des choses simples valables sous Java 1.0.x fonctionnent
encore aujourd'hui (pas toutes); certain schémas ont évolués
(notamment pour les interfaces) mais rien n'empêche de préférer
l'ancien, c'est plus affaire de gout, d'expérience ou de contraintes
externes, n'hésitez pas à parcourir les différentes solutions possibles
avant d'opter systématiquement pour la plus récente.


show() doit être remplacé par setVisible(true) C'est un détail :-)



Mais qui a son importance... car une fois que c'est corrigé, non
seulement je n'ai plus le warning, mais surtout ça marche!



cela peut dépendre de la VM exécutant l'applet (donc de la distrib.)

'show' a été déprécié avec le "JDK 1.5" soit la version 1.1.5.
la classe Frame date de Java 1.0, lors de l'introduction de awt
en Java 1.1, certaines méthodes ont été renommés, harmonisées.

une méthode "deprecated" est généralement supportée par la version en
cours et la suivante (soit Java 1.0.x et 1.1.x), à partir de la 1.2.x
(aka Java 2), le support de telles méthodes n'est pas obligeatoire
dans votre cas le compilo la connaissait encore (il n'a émis qu'un
warning) alors que la VM utilisée ne la connaissait pas, d'où
l'erreur.

Les fichiers .class ne dépendent pas du processeur, donc ça ne
vient pas de là ;-)



Je me disais bien, aussi...



jamais du processeur, il peuvent venir du compilo si la structure
des .class changaient, ce n'est pas le cas ici non plus.

Sans être expert en applettes, je dirais que c'est un problème du
plugin java de ton navigateur : normal que ça marche sous OSX et
(je suppose) Safari, car java est installé par défaut, et configuré
pour le web.



Oui... Mais en 1.5. :-(



du fait de la "liberté" de supporter ou non les méthodes dépréciées,
leur présence ou absence varira selon la version mais autant ou plus
encore de la distribution.

Oui, c'est bien ça. J'en conclus que je peux travailler à mes bazars
en 1.6, et même avec l'Ubuntu de mon Mac, mais qui si je veux
vraiment mettre ça sur le web j'ai intérêt à compiler en 1.5. Ce
n'est pas très satisfaisant pour l'esprit mais je m'en contenterai.



oui et non, la version du compilo et de la VM doivent être compatible
et très récent uniquement si vous utilisez des packages très récents.
ce n'est pas le cas dans votre code, vous pouvez compiler avec un javac
1.6.x et exécuter avec une VM 1.0 (2.1.0 voire 1.1.x) si vous utilisez
que des "vieilles" API (celles de java.awt.* de votre code).

la seule "erreur" était d'utiliser les API de Java 1.0.x

Sylvain.
Avatar
Jean-Luc Ancey
Sylvain SF a écrit :

vous demandez quelque chose simple mais regrettez le manque de mise
à jour ?! des choses simples valables sous Java 1.0.x fonctionnent
encore aujourd'hui (pas toutes); certain schémas ont évolués
(notamment pour les interfaces) mais rien n'empêche de préférer
l'ancien, c'est plus affaire de gout, d'expérience ou de contraintes
externes, n'hésitez pas à parcourir les différentes solutions possibles
avant d'opter systématiquement pour la plus récente.



En l'occurrence, ce qui m'intéresserait le plus, ce serait
la compatibilité avec un maximum de VM, y compris les très
récentes, y compris les un peu obsolètes. Mais si on ne peut
pas faire les deux à la fois, j'aurais plutôt tendance à
choisir ce qu'il y a de plus à jour: ceux qui ont des
configurations obsolètes finiront bien par les faire évoluer.

une méthode "deprecated" est généralement supportée par la version en
cours et la suivante (soit Java 1.0.x et 1.1.x), à partir de la 1.2.x
(aka Java 2), le support de telles méthodes n'est pas obligeatoire
dans votre cas le compilo la connaissait encore (il n'a émis qu'un
warning) alors que la VM utilisée ne la connaissait pas, d'où
l'erreur.



Oui, je comprends mieux. Merci de l'explication.

du fait de la "liberté" de supporter ou non les méthodes dépréciées,
leur présence ou absence varira selon la version mais autant ou plus
encore de la distribution.



C'est logique... mais c'est casse-pieds!

la version du compilo et de la VM doivent être compatible
et très récent uniquement si vous utilisez des packages très récents.
ce n'est pas le cas dans votre code,



Le problème vient sans doute de la VM de mon Mac. L'embêtant,
c'est que c'est aussi celle de l'applemaniaque moyen, donc j'hésite
à faire l'impasse sur le problème.

Enfin, déjà, je sais que je pars sur des bases à peu près propres
et valides, et c'est ce qui m'importait le plus.

Merci des explications! :-)

--
Jean-Luc Ancey - jlancey[at]nospam.com
(remplacer "nospam" par "rocketmail")