Changer la transparence d'un JPanel

jimmypage64 Messages postés 164 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 21 septembre 2010 - 17 mars 2009 à 13:54
benmor Messages postés 49 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 27 novembre 2011 - 17 mars 2009 à 20:06
Bonjour,

Je débute sur JAVA.
Je voudrais changer la transparence d'un JPanel sur le MouseEntered et MouseExited. 
Voici le code de ma classe Case (extends JPanel)

...
public void mouseEntered(MouseEvent e) {
        this.setBackground(new Color(255,0,0,80));
        this.repaint();}




    public void mouseExited(MouseEvent e) {
        this.setBackground(new Color(0,0,255,20));
        this.repaint();
    }
...


Le problème est qu'au lieu de me changer le fond de ma case, j'ai l'impression qu'a chaque this.repaint que je fais, le setBackground me rajoute une couche en fond de mon composant.
Au final a force de rentrer et de sortir de ma Case, elle devient de plus en plus opaque et la couleur alterne entre le rouge et le violet...

Quelqu'un aurait-il une solution pour remedier à ce problème ?

PS: dans l'exemple le résultat attendu serait : 
         - lorsque la souris est hors de la case :  fond bleu et transparent
         - lorsque la souris est dans la case : fond rouge et un peu moins transparent.

Merci d'avance 



[8)]Zoso

3 réponses

cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
17 mars 2009 à 14:59
Salut,

J'ai testé rapidement ton exemple et j'ai le même "problème", pour moi ça ressemble à un bug.

Tu peux toujours le résoudre comme ça, mais ce n'est pas optimal, je pense :

fenetre = new JFrame("Test");
fenetre.setSize(640, 480);
fenetre.setLocationRelativeTo(null);
fenetre.setLayout(new BorderLayout());

panelFond = new JPanel(new BorderLayout());
panelFond.setBackground(Color.WHITE);

panel = new JPanel();
panel.setBackground(BLEU);

panel.addMouseListener(new MouseListener() {

@Override
public void mouseClicked(MouseEvent e) {

}

@Override
public void mouseEntered(MouseEvent e) {

panel.setBackground(ROUGE);

//panel.getParent().repaint();
fenetre.repaint();

}

@Override
public void mouseExited(MouseEvent e) {

panel.setBackground(BLEU);

//panel.getParent().repaint();
fenetre.repaint();

}

@Override
public void mousePressed(MouseEvent e) {

}

@Override
public void mouseReleased(MouseEvent e) {

}

});

panelFond.add(panel);

fenetre.add(panelFond);

fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fenetre.setVisible(true);
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
17 mars 2009 à 15:03
Re, (j'ai pas accès à l'éditeur avancé sous Opera du coup le formatage a un peu foiré)

fenetre

=
new JFrame(
"Test");

fenetre .setSize(640, 480);

fenetre.setLocationRelativeTo(
null);

fenetre.setLayout(
new BorderLayout());

panelFond =
new JPanel(
new BorderLayout());

panelFond.setBackground(Color.
WHITE);

panel =
new JPanel();

panel.setBackground(
BLEU);

panel.addMouseListener(
new MouseListener() {

@Override

public
void mouseClicked(MouseEvent e) {

}

@Override

public
void mouseEntered(MouseEvent e) {

panel.setBackground(
ROUGE);

//panel.getParent().repaint();

fenetre.repaint();

}

@Override

public
void mouseExited(MouseEvent
e) {

panel.setBackground(
BLEU);

//panel.getParent().repaint();

fenetre.repaint();

}

@Override

public
void mousePressed(MouseEvent e) {

}

@Override

public
void mouseReleased(MouseEvent e) {

}

});

panelFond.add(
panel);

fenetre.add(
panelFond);

fenetre.setDefaultCloseOperation(JFrame.
EXIT_ON_CLOSE);

fenetre.setVisible(
true);
0
benmor Messages postés 49 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 27 novembre 2011 9
17 mars 2009 à 20:06
Je pense pas que ce soit un bug jojolemariole.

Si tu fait un repaint sur le panel, alors seul celui-ci sera repaint, et donc la transparence se fait par rapport à ce qui existe déjà.
Si tu fait un repaint sur la fenêtre, alors il repaint d'abord ce qu'il y a sous le panel et ensuite la transparence se fait donc sur ce qu'il y a sous le panel.

Ca me paraît normal à moi.

"panel.getParent().repaint();
" ne fonctionne pas dans ton cas (j'ai testé) sans doute parce que tu utilise un BorderLayout et donc tout l'espace est utilisé donc (optimisation) seul panel est repaint. J'ai testé avec un FlowLayout, ça fonctionne.
0
Rejoignez-nous