je m'aperçois que mon message n'est pas visible sur le serveur, je le
reposte donc sans les deux images d'exemple (c'est peut-être ce qui
bloque). Prenez deux images 64x64 ou laissez moi votre adresse email pour
que je vous les envoie.
...
j'ai toujours un petit problème dans la réalisation de mon menu transparent.
J'ai mis un petit exemple de code pour bien comprendre :
- j'affiche un label dans une fenêtre "transparente" (ne regardez pas trop
la gestion de la transparence, c'est perfectible mais c'est pour ne pas
alourdir le code d'exemple)
- je mets un MouseListener sur ce label : quand la souris entre sur ce
label, l'image change.
Le problème, c'est que quand la souris entre, l'image change mais le fond
sous la nouvelle image n'est plus transparent (il est couleur de fenêtre
par défaut, c'est à dire gris chez moi). MAIS, mais, si on ressort et
réentre, le fond est bien redessiné "transparent" (c'est à dire capture de
fond d'écran modifiée).
Je tourne en rond et n'arrive pas à résoudre ce petit point de détail.
public class TransparentWindow extends JWindow implements
MouseMotionListener, FocusListener {
JPanel contentPane;
ImageIcon img1 = new ImageIcon("package.png"); // mettez le bon path
ImageIcon img2 = new ImageIcon("email.png");
JLabel label1 = new JLabel(img1);
Image img,tim;
Graphics tig;
Point mp;
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
// Constructeur
public TransparentWindow() {
// fenêtre de 475x100, centrée en haut
setBounds((int)(d.getWidth()-475)/2,0,475,100);
// capture le fond d'écran pour l'effet "transparent"
capture();
// ajout du label au milieu de ma fenêtre
contentPane = (JPanel) getContentPane();
contentPane.setLayout(new FlowLayout(FlowLayout.CENTER,15,15));
contentPane.add(label1);
// ajout d'un MouseListener qui change l'image
label1.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e){
label1.setIcon(img2);
paint(getGraphics());
}
});
// ajout des listeners pour la gestion de la transparence
addMouseMotionListener(this);
addFocusListener(this);
setVisible(true);
} // fin du constructeur
// Listeners pour la transparence
public void focusGained(FocusEvent fe)
{
Point p = getLocation();
setLocation(11111,0);
capture();
setLocation(p);
}
public void focusLost(FocusEvent fe)
{
}
public void capture()
{
try {
Robot r = new Robot();
Rectangle rect = new Rectangle(0,0,d.width,d.height);
img = r.createScreenCapture(rect);
} catch(AWTException awe) {
System.out.println("robot excepton occurred");
}
}
public void mouseDragged(MouseEvent m)
{
Point p = m.getPoint();
int x = getX()+p.x-mp.x;
int y = getY()+p.y-mp.y;
setLocation(x,y);
Graphics g = getGraphics();
paint(g);
}
public void mouseMoved(MouseEvent m)
{
mp = m.getPoint();
}
// paint
public void paint(Graphics g)
{
// Crée une image off-screen (double-buffering) de taille de la
fenêtre
// et crée un contexte graphique pour dessiner dans cette image
if (tim == null)
{
tim = createImage(getWidth(),getHeight());
tig = tim.getGraphics();
}
// dessine la capture du fond d'écran dans l'image off-screen créée
// (dessine la partie positionnée à l'endroit de la fenêtre)
// puis dessine une cadre semi-transparent grisâtre dessus
tig.drawImage(img,0,0,getWidth(),getHeight(),
getX(),getY(),getX()+getWidth(),getY()+getHeight(),null);
tig.setColor(new Color(0,0,0,128));
tig.fillRoundRect(0,0,getWidth(),getHeight(),100,120);
// affiche l'image à l'écran
g.drawImage(tim,0,0,null);
// redessine le label avec le fond "transparent"
Rectangle rect2 = label1.getBounds();
Graphics lg = g.create(rect2.x, rect2.y, rect2.width, rect2.height);
label1.paint(lg);
}
public void update(Graphics g)
{
this.paint(g);
}
// Main
public static void main (String[] args)
{
new TransparentWindow();
}