JApplet et JButton ...

Résolu
Squaredge Messages postés 20 Date d'inscription jeudi 23 février 2006 Statut Membre Dernière intervention 25 février 2006 - 23 févr. 2006 à 03:26
Squaredge Messages postés 20 Date d'inscription jeudi 23 février 2006 Statut Membre Dernière intervention 25 février 2006 - 24 févr. 2006 à 21:51
Bonjour a tous, voila dans le cadre d'un projet scolaire je dois réaliser une Applet possédant des boutons devant posséder des images. Je me suis donc natrellement tourner vers swing. J'essaie donc pour l'instant de faire une Applet (JApplet pour le coup ...) qui affiche un background et des élements sur ce dernier. Et c'est la que le probleme se pose. Quand j'affiche l'image et qu'ensuite je pose mais bouton, ceux ci n'apparaissent que je les survole dans la page ! (embetant n'est ce pas ?). J'ai cherché partout mais je n'ai pas trouvé ... J'ai trouvé un code de JFrame sur ce site mais sans arriver a le transcrire en Applet. Je me tourne donc vers vous .
Je met le code qui pour l'instant me pose probleme :

import javax.swing.*;
import java.awt.*;
import javax.swing.JApplet;

public class TestApplet extends JApplet{

Image fond;
JButton bMarron = new JButton("Marron");
Container contenu = getContentPane();

// METHODE INIT
public void init(){
fond = getImage(getDocumentBase(),"fond.jpg");
contenu.setLayout(null);
setOpaque(false);
}

public void paint(Graphics g) {
g.drawImage(fond, 0, 0, this);
bMarron.setBounds(65,455,15,15);
contenu.add(bMarron);
}
}

Merci a celui qui pourra m'aider :)

20 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 févr. 2006 à 11:04
Salut,



essai plutot la methode paintComponent(Graphics g)



enfait si tu veux JApplet herite de JPanel et sur un JPanel (ou
composant swing (à l'exception de JFrame)) il ne faut pas dessiner dans
la methode paint....



import javax.swing.*;
import java.awt.*;
import javax.swing.JApplet;

public class TestApplet extends JApplet{

Image fond;
JButton bMarron = new JButton("Marron");
Container contenu = getContentPane();

// METHODE INIT
public void init(){
fond = getImage(getDocumentBase(),"fond.jpg");
contenu.setLayout(null);
// setOpaque(false); //pas utile


bMarron.setBounds(65,455,15,15);
contenu.add(bMarron);


}

public void paintComponents(Graphics g) {
g.drawImage(fond, 0, 0, this);

super.paintComponents(g);//hyper
important pour dessiner tes boutons et autre





//composant de ton applet

}
}

WORA
3
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
24 févr. 2006 à 10:29
Salut,



bon je viens de modifier certaine choses de ton appli et adapter les chemins à mon pc

la plus grosse de tes erreurs reste le ratachement des composant a ton
panel dans la methode paintXXX il ne faut pas faire ca bon ba bonne
lecture ....



Je tourne sous eclipse donc je te file mon script ant pour le jar et vu
que je suis dans un bon jour je te file aussi le fichier html :





Applet.java :



import javax.swing.JApplet;



public class Applet extends JApplet{



public void init(){

getContentPane().add(new Application(this));

}

}



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

Application.java :



import javax.swing.*;

import java.awt.*;

import java.awt.event.*;



public class Application extends JPanel implements ActionListener{



// ATTRIBUTS DE LA CLASSE

private Image fond;

private int compteur;

private JPanel couleur = new JPanel();

private String chemin = new String();

private Color coul;



private JButton bMarron = new JButton("Marron"),

bRouge = new JButton ("Rouge"),

bBleu = new JButton ("Bleu"),

bBleu2 = new JButton ("Bleu 2"),

bVert1 = new JButton ("Vert"),

bVert2 = new JButton ("Vert 2"),


bMarron2 = new JButton ("Marron
2");



private JButton bhaut = new JButton ("Haut"),

bbas = new JButton("Bas"),

motif ;//= new JButton("Motif");



// CONSTRUCTEUR DE LA CLASSE

public Application(Applet app){



this.fond = app.getImage(app.getCodeBase(),"fond.jpg");



// RECUPERATION DU CHEMIN OU SE SITUE L'IMAGE DU MOTIF



//chemin="images/motifs/";//adapt? pour moi

//chemin=chemin.concat(chemin.valueOf(compteur));//adapt? pour moi

//chemin=chemin.concat(".gif");//adapt? pour moi

chemin = "test.gif";

motif = new JButton (new ImageIcon(app.getImage(app.getCodeBase(),chemin)));



// ON APPLIQUE LES BOUTONS :

// Ajout du bouton Marron

bMarron.setToolTipText("Marron Fonc?");

bMarron.setBounds(65,455,15,15);

bMarron.addActionListener(this);

add(bMarron);



// Bouton Rouge

bRouge.setToolTipText("Rouge");

bRouge.setBounds(90,460,15,15);

bRouge.addActionListener(this);

add(bRouge);



// Bouton Bleu

bBleu.setToolTipText("Bleu Fonc?");

bBleu.setBounds(115,470,15,15);

bBleu.addActionListener(this);

add(bBleu);



// Bouton Bleu 2

bBleu2.setToolTipText("Bleu Clair");

bBleu2.setBounds(135,492,15,15);

bBleu2.addActionListener(this);

add(bBleu2);



// Bouton Vert 1

bVert1.setToolTipText("Vert Clair");

bVert1.setBounds(80,520,15,15);

bVert1.addActionListener(this);

add(bVert1);



// Bouton Vert 2

bVert2.setToolTipText("Vert Fonc?");

bVert2.setBounds(110,515,15,15);

bVert2.addActionListener(this);

add(bVert2);



// Bouton Marron 2

bMarron2.setToolTipText("Marron Clair");

bMarron2.setBounds(50,510,15,15);

bMarron2.addActionListener(this);

add(bMarron2);



// CREATION DES BOUTONS POUR L'AFFICHAGE DES MOTIFS

// Creation de la fleche de defilement : image suivante

bhaut.setToolTipText("Cliquez pour faire afficher l'image suivante.");

bhaut.setBounds(710,248,32,32);

bhaut.addActionListener(this);

add(bhaut);



// Creation de la fleche de defilement : image precedente

bbas.setToolTipText("Cliquez pour faire afficher l'image pr?c?dente.");

bbas.setBounds(710,420,32,32);

add(bbas);



// Creation de l'affichage du motif

motif.setToolTipText("Cliquez pour utiliser le motif");

motif.setBounds(670,300,110,100);

add(motif);



// Affichage de la couleur selectionn'e

couleur.setBounds(75,350,50,50);

couleur.setBackground(coul);

add(couleur);

}



// METHODE D'AFFICHAGE DES COMPOSANTS DE L'APPLET

public void paintComponent(Graphics g) {

g.clearRect(0, 0,
getSize().width, getSize().height);//tres utile pour les animations ca
evite les merdouilles

super.paintComponent(g);

g.drawImage(fond, 0, 0, this);







}



/******************************* METHODES DE
RECUPERATION DES EVENEMENTS ET DE LEUR TRAITEMENTS *******************/

public void actionPerformed(ActionEvent e){



// Si l'on change de couleur

if (e.getSource() == bMarron){

coul = new Color(153,52,0);

couleur.setBackground(coul);

}



if (e.getSource() == bRouge){

coul = new Color(254,0,0);

couleur.setBackground(coul);

}



if (e.getSource() == bBleu){

coul = new Color(0,0,254);

couleur.setBackground(coul);

}



if (e.getSource() == bBleu2){

coul = new Color(0,153,255);

couleur.setBackground(coul);

}



if (e.getSource() == bVert1){

coul = new Color(0,255,1);

couleur.setBackground(coul);

}



if (e.getSource() == bVert2){

coul = new Color(1,153,52);

couleur.setBackground(coul);

}



if (e.getSource() == bMarron2){

coul = new Color(154,102,52);

couleur.setBackground(coul);

}



// Si l'on a appuy? sur le bouton du haut

/*if (e.getSource() == bhaut){



// On
incremente le compteur et on modifie le chemin de l'image en consequence

compteur++;

chemin="images/motifs";

chemin=chemin.concat(chemin.valueOf(compteur));

chemin=chemin.concat(".gif");

motif.setIcon(new ImageIcon(chemin));

}*/

}

}



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

build.xml :














































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



index.html :









HTML Test Page





























WORA
3
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
24 févr. 2006 à 15:33
C'est assez simple enfaite tu creer une référence en global exemple



public class Application extends JPanel implements ActionListener{

................

private Applet app = null;



public Application(Applet app){

................

this.app = app;

................

}





public void actionPerformed(ActionEvent e){

................

if (e.getSource().equals(bhaut)){

chemin = "test2.gif");

motif.setIcon(new ImageIcon(app.getImage(app.getCodeBase(),chemin)));

}

}

}

WORA
3
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
24 févr. 2006 à 21:13
Salut,



deja je ne peux lire l'applet tu as une petite merdouille sur le chemin de ton gif mais bon....



je suis sous jdk 1.5 donc l'exemple sera adapté pour...



public class Application extends JPanel implements ActionListener{

................

//--------
tu creer un vecteur de rectangle en global

private Vector<Rectangle> vecRectangle = new Vector<Rectangle>();



public Application(Applet app){

................

}



//--------dans ta methode paint tu redessine les rectangles

public void paintComponent(Graphics g) {


g.clearRect(0, 0, getSize().width, getSize().height);


super.paintComponent(g);


g.drawImage(fond, 0, 0, this);

g.setColor(Color.black);


if(!vecRectangle.isEmpty())


for(Rectangle rec: vecRectangle)


g.drawRect(rec.x, rec.y, rec.width, rec.height);


//g.fillRect(rec.x, rec.y, rec.width, rec.height);

}

..............

//--------
et dans ta methode mouseClicked tu ajoute les positions




public void mouseClicked(MouseEvent e){


vecRectangle.add(new Rectangle(e.getPoint().x, e.getPoint().y, 10, 10));


repaint();//pour un effet imédiat

}

}











maintenant pour corser un peu la chose et rendre le dessin plus beau si
tu dessine des ellipses et un bonus si tu veux mettre un thread et
eviter les clignotements :)




public class Application extends JPanel implements ActionListener{

................

//-------- tu creer un vecteur de rectangle en global

private Vector<Rectangle> vecRectangle = new Vector<Rectangle>();

private Image offscreen = null;



public Application(Applet app){

................

}



//--------dans ta methode paint tu redessine les rectangles

//-------- tu active l'anti aliasing

//-------- et tu dessine dans un buffer d'image

//-------- en effet en java on ne dessine pas dans une image mais dans un buffer d'imge

public void paintComponent(Graphics g) {

g.clearRect(0, 0, getSize().width, getSize().height);

super.paintComponent(g);

g.drawImage(fond, 0, 0, this);



//création du buffer d'image

//package ava.awt.image.BufferedImage

BufferedImage buff =
(BufferedImage) (createImage(getSize().width, getSize().height));

//création d'un objet Graphics2D

Graphics2D g2 = buff.createGraphics();



//activation de l'aliasing matte
la classe RenderingHints il y a d'autre rendu possible d'activer

//package java.awt.RenderingHints

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);



//petit plus si tu veux activer de la transparence

//si alpha vaut 0.0f transparence totale si il vaut 1.0f pas de transparance

//package java.awt.AlphaComposite;

float alpha = 0.5f;

g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));



g2.setColor(Color.black);

if(!vecRectangle.isEmpty())

for(Rectangle rec: vecRectangle)


g.drawRect(rec.x, rec.y, rec.width, rec.height);


//g.fillRect(rec.x, rec.y, rec.width, rec.height);



//desactivation de l'aliasing

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);



//dessine l'image

g.drawImage(buff, 0, 0, this);







}

//-------- Redefinition de la methode update pour supprimer les

//-------- clignotements lors d'une animation

public void update(Graphics g) {

if (offScreen == null)

offScreen = createImage(getWidth(), getHeight());

Graphics offGr = offScreen.getGraphics();

g.drawImage(offScreen, 0, 0, this);

paint(offGr);

}



..............

//-------- et dans ta methode mouseClicked tu ajoute les positions

public void mouseClicked(MouseEvent e){

vecRectangle.add(new Rectangle(e.getPoint().x, e.getPoint().y, 10, 10));

repaint();//pour un effet imédiat

}

}








WORA
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 févr. 2006 à 11:05
J'oublié il n'est pas util de faire Container contenu = getContentPane();

et
contenu.add(bMarron);



un simple add
(bMarron); suffit



WORA
0
Squaredge Messages postés 20 Date d'inscription jeudi 23 février 2006 Statut Membre Dernière intervention 25 février 2006
23 févr. 2006 à 13:42
Je viens de tester ta méthode Twinuts mais maintenant j'ai effectivement le bouton présent dans le lancement de l'applet, mais je n'ai plus le background :(
0
Squaredge Messages postés 20 Date d'inscription jeudi 23 février 2006 Statut Membre Dernière intervention 25 février 2006
23 févr. 2006 à 14:40
Ahhh c'est bon ! Je viens de réussir l'affichage des 2 élèments via le paintComponent(). Mais désormais un autre problème se pose : j'aimerais pouvoir mettre des images sur mes boutons. J'utilise donc cette méthode :

bMarron = new JButton (new ImageIcon("marron.jpg"));

Sous appletviewer je n'ai aucun problème ... mais quand j'utilise un navigateur, il y a un problème de sécurité (il me dit que l'image ne peut pas être lu).
J'ai parcouru un peu les forum et apparemment il faudrait signer l'applet. J'ai bien tenté de regarder la documentation Sun mais c'est du charabia :(
Si quelqu'un pouvait m'aider :) Merci bien !
0
Squaredge Messages postés 20 Date d'inscription jeudi 23 février 2006 Statut Membre Dernière intervention 25 février 2006
23 févr. 2006 à 14:40
Ahhh c'est bon ! Je viens de réussir l'affichage des 2 élèments via le paintComponent(). Mais désormais un autre problème se pose : j'aimerais pouvoir mettre des images sur mes boutons. J'utilise donc cette méthode :

bMarron = new JButton (new ImageIcon("marron.jpg"));

Sous appletviewer je n'ai aucun problème ... mais quand j'utilise un navigateur, il y a un problème de sécurité (il me dit que l'image ne peut pas être lu).
J'ai parcouru un peu les forum et apparemment il faudrait signer l'applet. J'ai bien tenté de regarder la documentation Sun mais c'est du charabia :(
Si quelqu'un pouvait m'aider :) Merci bien !
0
scaryman Messages postés 492 Date d'inscription vendredi 30 janvier 2004 Statut Membre Dernière intervention 16 mai 2007 12
23 févr. 2006 à 15:07
Salut

Ben je crois que c'est normal vu que les applets ne peuvent pas lire sur le disque de l'utilisateur
0
Squaredge Messages postés 20 Date d'inscription jeudi 23 février 2006 Statut Membre Dernière intervention 25 février 2006
23 févr. 2006 à 15:14
Oui donc il faut signer l'applet pour lui autoriser des choses supplémentaires. Mais comment faire ?
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 févr. 2006 à 16:58
Salut,



tu as plusieurs methodes pour lire un fichier sur ton disque perso je
te conseil de signer ton applet.... vu que l'applet ne peut pas
atteindre de fichier ou ouvrir de socket sur un poste ce même dans son
'sand box'



A savoir c'est que si tu fais tourner l'applet en local et que tu veux
atteindre un fichier il te faut mettre getCodeBase() devant le chemin
de ta ressource pour bien partir depuis le repertoir courrant de
l'applet, je ne sais pas trop pour le mode distant si ca tourne de la
meme maniere, les applets et moi on s'aime pas vraiment j'avoue que
j'evite cette salleté comme la peste....




WORA
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 févr. 2006 à 17:05
pour signer un jar

http://java.developpez.com/faq/java/?page=execution#signature_jar

mais tu as plein d'autres exemple sur le net assez simple ....

WORA
0
Squaredge Messages postés 20 Date d'inscription jeudi 23 février 2006 Statut Membre Dernière intervention 25 février 2006
23 févr. 2006 à 17:09
Merci encore !!!!
J'ai reflechi a ce systeme et en fait ca ne me sert a rien de signer l'applet vu que normalement le fichier se trouvera sur le serveur a coté de l'applet. L'erreur de sécurité que j'obtiens et donc surement du a un probleme de code. J'utilise en effet pour mettre une image sur un bouton le code :

private JButton motif = new JButton (new ImageIcon(chemin));

C'est peut etre ca qui fait foirer l'applet sur un navigateur non ? (ca passe tres bien via appletviewer). Il n'y a pas d'autre methode pour affecter une image sur un JButton ? Dans les constructeurs de la doc java ce format me semble le plus simple ... Je suis perdu :s
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 févr. 2006 à 18:41
Essai de mettre ton image dans le jar



exemple si tu met l'image img.png dans le package org.graphics.images



pour la charger tu fais :



Image img = Toolkit.getDefaultToolkit().



getImage(getClass().getClassLoader().



getResource("org/graphics/images/img.png"));



surtout pas de \ dans le chemin



avec un peu de chance ca devrai passer (sans garantie je n'ai pas testé avec les applet non signée)



merci de me tenir au jus si tu test (je dormirai moins stupide ce soir :) )

WORA
0
Squaredge Messages postés 20 Date d'inscription jeudi 23 février 2006 Statut Membre Dernière intervention 25 février 2006
23 févr. 2006 à 22:27
Je n'ai pas essayé, je verrais demain ce que ca donne Twinuts, j'en ai un peu marre la mais j'ai bien avancé grace a toi ;) Merci encore !
0
Squaredge Messages postés 20 Date d'inscription jeudi 23 février 2006 Statut Membre Dernière intervention 25 février 2006
24 févr. 2006 à 02:44
Bon bah apres avoir essayé pas mal de chose, je bloque ...
Voila les src qui posent probleme :

http://www.fpaternonline.com/Applet2/Applet.java
http://www.fpaternonline.com/Applet2/Application.java

Si quelqu'un arrive a trouver mon erreur ... (sous appletviewer ca passe toujours aussi bien ... des que j'ouvre avec mon navigateur rien .. c'est blanc.

Merci encore !!
0
Squaredge Messages postés 20 Date d'inscription jeudi 23 février 2006 Statut Membre Dernière intervention 25 février 2006
24 févr. 2006 à 13:22
Je ne sais que dire Twinuts sinon merci ... l'applet marche enfin !! Je n'ai pas compris l'histoire du xml mais ce n'est pas grave, j'ai enfin une applet opérationnelle !!! Un grand grand merci a toi !!
0
Squaredge Messages postés 20 Date d'inscription jeudi 23 février 2006 Statut Membre Dernière intervention 25 février 2006
24 févr. 2006 à 13:58
Voila, j'ai reussi a placer tous les éléments de mon applet comme je le souhaitais. Cependant, j'ai remarqué que tu utilisais la méthode :

motif = new JButton (new ImageIcon(app.getImage(app.getCodeBase(),chemin)));

Cela te permettais de placer l'image sur le bouton. Je viens d'essayer de changer cette image en cliquant sur un bouton de l'applet. Le problème est que tu utilises la variable app de type Applet pour pouvoir modifier sur le bouton. Mais quand on réalise un ActionListener, je n'ai pas accès a cette variable étant donné que celle-ci est un paramétre du constructeur ... Comment faire ? Merci encore ;)
0
Squaredge Messages postés 20 Date d'inscription jeudi 23 février 2006 Statut Membre Dernière intervention 25 février 2006
24 févr. 2006 à 18:03
Ah en effet ca marche fort bien maintenant :)
J'aurais une derniere question a te poser (vu que t'as l'air de bien toucher en Java ;))
Voila donc le programme que j'ai réalisé pour le moment :

http://fpaternonline.com/Java/page.html

C'est juste un test mais j'aurais aimé savoir : quand je sélectionne un element sur la case de droite, j'arrive a le dessiner sur l'applet (j'ai utilisé un g.drawRect(e.getX(),e.getY(),10,10);) dans un MouseClicked.
Le programme c'est que lorsque je réduit la page internet et que je la réouvre, ce que j'ai dessiné a disparu :(

J'ai donc utilisé un vecteur et j'ai stocké les informations dedans (coordonnées de tous les points). Mais je ne sais pas quand les réafficher ...

De même, l'utilisation d'un JPanel ou autre element Java ne serais pas plus facile ? Bien qu'il faille encore une fois dessiner des elements sur un JPanel ... ce qui n'est pas forcement facile.

Je crois que l'utilisation d'un g.draw.. serais plus facile (en faisant des tests sur la position du curseur ... mais je ne sais pas comment raffraichir ...

Sinon encore une fois merci Twinuts ... c'est la premiere fois que je poste sur ce forum et je suis vraiment surpris d'avoir obtenu une reponse et de la rapidité de celle-ci. C'est super d'avoir des forums comme ca ;) Merci ;)
0
Squaredge Messages postés 20 Date d'inscription jeudi 23 février 2006 Statut Membre Dernière intervention 25 février 2006
24 févr. 2006 à 21:51
Superbe aide Twinuts !! Tout marche impeccable maintenant ! Un grand merci a toi ;)
0
Rejoignez-nous