2 JPanel superposées, mais pas de transparence ?!

CyberDenix Messages postés 17 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 24 décembre 2007 - 8 juin 2005 à 00:58
CyberDenix Messages postés 17 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 24 décembre 2007 - 8 juin 2005 à 15:46
Bonjour,


Je créé une JFrame dans la quelle j'insere 2 JPanels contenant chacun une image .png (insertion de A, puis de B), chacun ayant un setOpaque (false). Leur fond est donc censé etre transparent.
Le JPanel A contient une carte du monde.
Le JPanel B contient un nuage que je fais bouger dans la methode paint().
Pourtant seul le JPanel B semble s'afficher.
En réalité, je pense que A est affiché mais qu'il est masqué par B.
En effet, le fond du JPanel B n'est pas transparent malgré le setOpaque(false).


J'ai essayé de dessiner les deux images dans un meme JPanel, cela marche sans probleme.
Mais je voudrais les afficher dans des panels différents afin de ne redessiner que le panel de B.
Ainsi j'éviterai de redessiner la carte du monde pour rien, car seul le nuage bouge.
Que faire ?

5 réponses

safisoft Messages postés 489 Date d'inscription vendredi 30 janvier 2004 Statut Membre Dernière intervention 13 mai 2009 6
8 juin 2005 à 10:17
je X que tu dois jouer sur le backgroundcolor du panel B, tu pe utiliser une couleur Color(r,g,b,alpha) et tu joue sur le dernier paramètre pour la transparence
0
bloofi Messages postés 388 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 3 mai 2006 2
8 juin 2005 à 10:44
Cela depend aussi du layout utilisé.

as-tu redéfini la methode paint de A ?

essaye de mettre un super.paint(g) au debut de la methode paint de B
0
CyberDenix Messages postés 17 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 24 décembre 2007
8 juin 2005 à 10:58
J'ai essayé :
pnl_fog.setOpaque(true);
pnl_fog.setBackground(new Color(255, 255, 255, Color.TRANSLUCENT));

Le fond est toujours opaque (je l'ai mis en opaque, c'est sur, mais la transparence du fond ne semble pas marcher).
Me suis-je trompé quelque part ?
0
CyberDenix Messages postés 17 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 24 décembre 2007
8 juin 2005 à 11:22
--------------------------------- La carte du monde :

public class PanelAvecFond extends JPanel
{
Image backGround = null;
public PanelAvecFond(Image backGround)
{
this.backGround = backGround;
setOpaque( false );
}
public void paint(Graphics buffer)
{
if (backGround != null)
buffer.drawImage( backGround, 0, 0, getSize().width, getSize().height, this);
super.paint(buffer);
}
public void update( Graphics g )
{ paint(g); }
public static Image loadImages(JFrame frm, String imageFile )
{...}
public static URL getURL( String file )
throws MalformedURLException
{...}
}

------------------------------------------- Les nuages (enfin le brouillard quoi) :

public class PanelFog extends JPanel
{
Image fog = null;
public PanelFog(Image fog)
{
this.fog = fog;
setOpaque( false );
}
public void paint(Graphics buffer)
{
super.paint(buffer); //Mise ici j'ai les boutons de mon menu dessous les nuages
if (fog != null)
{ draw_fog(buffer, ...); }
//super.paint(buffer); //Mise ici j'ai les boutons de mon menu par dessus les nuages
}
public void update( Graphics g )
{ paint(g); }
public void draw_fog(Graphics buffer, ...)
{ ... }
}

-------------------------------------- Le menu principal avec les boutons et les deux JPanels :

public class EcranTitre extends JFrame
{
RenderingThread renderingThread = new RenderingThread(); // boucle d'affichage
private JPanel pnl_map;
private JPanel pnl_fog;
private JButton btn1;

public EcranTitre(...)
{
this.getContentPane().setLayout( new BorderLayout() );
pnl_map = new PanelAvecFond(PanelAvecFond.loadImages(this, "images/splash_map.png"));
pnl_fog = new PanelFog(PanelAvecFond.loadImages(this, "images/splash_fog_3072.png"));
pnl_map.setLayout(null);
pnl_fog.setLayout(null);

//"New Game" Button
btn1 = create_btn(...);

this.getContentPane().add(pnl_map, BorderLayout.CENTER);
this.getContentPane().add(pnl_fog, BorderLayout.CENTER);

setIgnoreRepaint( true ); //inhibe la méthode courante d'affichage du composant
renderingThread.start(); //on commence la boucle d'affichage
}
public void graphicalRender() //ma propre methode de repaint
{
this.pnl_map.repaint();
this.pnl_fog.repaint();
}
class RenderingThread extends Thread
{ //Ce thread appelle le rafraichissement de notre fenêtre toutes les 20 milli-secondes
public void run()
{
while( true )
{
graphicalRender();
sleep( 20 );
}
}
}
}
0

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

Posez votre question
CyberDenix Messages postés 17 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 24 décembre 2007
8 juin 2005 à 15:46
Bon la réponse m'intéresse toujours pour des soucis de performance, mais je me suis résigné à tout dessiné dans le meme JPanel. ca rame légèrement, mais bon... Jvois pas d'autre solution étant donné qu'un JPanel semble en masquer un autre.
0
Rejoignez-nous