Bouton swing clignotant

Résolu
Floooo49 Messages postés 15 Date d'inscription samedi 28 février 2009 Statut Membre Dernière intervention 30 mars 2010 - 26 mars 2010 à 17:02
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;
                }
        }
}

5 réponses

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

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

Posez votre question
Floooo49 Messages postés 15 Date d'inscription samedi 28 février 2009 Statut Membre Dernière intervention 30 mars 2010
29 mars 2010 à 09:19
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?
0
Rejoignez-nous