Bouton swing clignotant [Résolu]

Floooo49
Messages postés
15
Date d'inscription
samedi 28 février 2009
Dernière intervention
30 mars 2010
- 26 mars 2010 à 17:02 - Dernière réponse : Floooo49
Messages postés
15
Date d'inscription
samedi 28 février 2009
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
Floooo49
Messages postés
15
Date d'inscription
samedi 28 février 2009
Dernière intervention
30 mars 2010
- 30 mars 2010 à 09:59
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.

Merci Floooo49 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de Floooo49
benmor
Messages postés
49
Date d'inscription
jeudi 14 avril 2005
Dernière intervention
27 novembre 2011
- 27 mars 2010 à 12:01
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
Floooo49
Messages postés
15
Date d'inscription
samedi 28 février 2009
Dernière intervention
30 mars 2010
- 27 mars 2010 à 12:37
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
Floooo49
Messages postés
15
Date d'inscription
samedi 28 février 2009
Dernière intervention
30 mars 2010
- 29 mars 2010 à 09:08
0
Merci
Bonjour, je viens de tester ton code et ... le bouton clignote toujours :s
Commenter la réponse de Floooo49
Floooo49
Messages postés
15
Date d'inscription
samedi 28 février 2009
Dernière intervention
30 mars 2010
- 29 mars 2010 à 09:19
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.