Bouton swing clignotant [Résolu]

Messages postés
15
Date d'inscription
samedi 28 février 2009
Statut
Membre
Dernière intervention
30 mars 2010
- - Dernière réponse : Floooo49
Messages postés
15
Date d'inscription
samedi 28 février 2009
Statut
Membre
Dernière intervention
30 mars 2010
- 30 mars 2010 à 09:59
Bonjour à tous.

Je suis actuellement en train de créer une applet pour upload de fichiers.
Bref ce n'est pas très important, voici mon problème :

Dans cette applet j'ai créé un bouton qui étend donc la classe JButton.
J'ai défini plusieurs images correspondants chacun à un état du bouton.
Seulement entre chaque image mon bouton clignote.

J'ai longuement chercher sur la toile et j'ai trouvé des choses parlant de double buffering, j'ai testé sans succès, certains disaient que swing gérait le double buffering de base donc je ne comprends vraiment pas pourquoi mon image saute.

Je vous envoi le code de mon bouton. En espérant de l'aide. Merci.
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.*;

public class button extends JButton implements MouseListener{
        private Image image;
        private Image img;
        private Image imgOn;
        private Image imgClicked;

        public button(ImageIcon anImg, ImageIcon anImgOn, ImageIcon anImgClicked)
        {
                this.image = anImg.getImage();
                this.img = anImg.getImage();
                this.imgOn = anImgOn.getImage();
                this.imgClicked = anImgClicked.getImage();
                this.addMouseListener(this);
        }       

        public void paintComponent(Graphics g)
        {                       
                g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this);      
        }


        @Override
        public void mouseClicked(MouseEvent event){
        }

        @Override
        public void mouseEntered(MouseEvent event){
                image = imgOn;
        }

        @Override
        public void mouseExited(MouseEvent event){
                image = img;
        }

        @Override
        public void mousePressed(MouseEvent event){
                image = imgClicked;
        }
        public void mouseReleased (MouseEvent event){
                // si l'on est plus sur le bouton
                if (event.getY() > 0)
                {
                        image = img;
                }else{
                        image = imgOn;
                }
        }
}
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
15
Date d'inscription
samedi 28 février 2009
Statut
Membre
Dernière intervention
30 mars 2010
3
Merci
Bon, après deux jours j'ai résolu mon problème, pour ceux qui aurait ou auront le même problème : ne pas étendre la classe Applet mais bien la classe JApplet de Swing.

Merci quand même pour l'aide.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 144 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Floooo49
Messages postés
49
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
27 novembre 2011
7
0
Merci
Bonjour,

Je pense comprendre...

Ici tu écoute des évènements dans le bouton, hors, le JButton par défaut que tu étant, l'écoute aussi (enfin son UI plus exactement), donc le bouton se paint comme un JButton "normal" puis ensuite passe dans ton paintComponent.

Pour faire ce genre de chose, je pense qu'il faut implémenter sont propre ButtonUI.
J'ai pas testé ton code, mais le mien ne clignote pas ;)

public class MyButtonUI extends BasicButtonUI
{
private enum STATUS
{
OVER, CLICKED, OUT;
}

STATUS status = STATUS.OUT;

public void installUI(JComponent c)
{
super.installUI(c);

c.addMouseListener(new MouseListener()
{
@Override
public void mouseClicked(MouseEvent event)
{
}

@Override
public void mouseEntered(MouseEvent event)
{
status = STATUS.OVER;
}

@Override
public void mouseExited(MouseEvent event)
{
status = STATUS.OUT;
}

@Override
public void mousePressed(MouseEvent event)
{
status = STATUS.CLICKED;
}

public void mouseReleased(MouseEvent event)
{
// si l'on est plus sur le bouton
if (event.getY() > 0)
{
status = STATUS.OUT;
}
else
{
status = STATUS.OVER;
}
}
});
}

public void paint(Graphics g, JComponent c)
{
Image image = null;
MyButton b = (MyButton) c;
switch (status)
{
case OVER:
image = b.getImageOver();
break;
case CLICKED:
image = b.getImageClicked();
break;
case OUT:
default:
image = b.getImageOut();
break;
}
g.drawImage(image, 0, 0, c.getWidth(), c.getHeight(), c);
}
}

public class MyButton extends JButton
{
private Image imageOut;
private Image imageOver;
private Image imageClicked;

public MyButton(ImageIcon anImg, ImageIcon anImgOn,
ImageIcon anImgClicked)
{
this.imageOut = anImg.getImage();
this.imageOver = anImgOn.getImage();
this.imageClicked = anImgClicked.getImage();

MyButtonUI ui = new MyButtonUI();
setUI(ui);
}

public Image getImageClicked()
{
return imageClicked;
}

public Image getImageOut()
{
return imageOut;
}

public Image getImageOver()
{
return imageOver;
}
}
Commenter la réponse de benmor
Messages postés
15
Date d'inscription
samedi 28 février 2009
Statut
Membre
Dernière intervention
30 mars 2010
0
Merci
Ok, merci à toi, je n'ai pas accès au code le week end, je teste ca dès lundi et je te tiens au courant!

Merci de ton aide.
Commenter la réponse de Floooo49
Messages postés
15
Date d'inscription
samedi 28 février 2009
Statut
Membre
Dernière intervention
30 mars 2010
0
Merci
Bonjour, je viens de tester ton code et ... le bouton clignote toujours :s
Commenter la réponse de Floooo49
Messages postés
15
Date d'inscription
samedi 28 février 2009
Statut
Membre
Dernière intervention
30 mars 2010
0
Merci
Je pense que le problème vient du faire que le bouton n'a pas de fond, il est transparent donc entre deux images chargées c'est le vide, donc j'aimerais savoir comment définir une image fixe de fond, c'est ca le double buffering non?
Commenter la réponse de Floooo49