public class TransparentWindow extends JWindow implements
MouseMotionListener, FocusListener {
// Déclarations pour le JLabel
JPanel contentPane;
JLabel label1 = new JLabel("Hello !");
// Déclarations pour la gestion de la transparence
Image img,tim;
Graphics tig;
Point mp;
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
public TransparentWindow() {
// Fenêtre de 475x100 centrée en haut
setBounds((int)(d.getWidth()-475)/2,0,475,100);
capture(); // Capture le fond d'écran pour la transparence
// Evénements pour la fenêtre transparente
addMouseMotionListener(this);
addFocusListener(this);
setVisible(true);
}
// Méthodes pour la gestion de 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();
}
public void paint(Graphics g)
{
if (tim == null)
{
tim = createImage(getWidth(),getHeight());
tig = tim.getGraphics();
}
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);
g.drawImage(tim,0,0,null);
}
public void cupdate(Graphics g)
{
this.paint(g);
}
// Main
public static void main (String[] args)
{
new TransparentWindow();
}
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Emmanuel Puybaret
j'ai créé une fenêtre personnalisée (transparente, très jolie) mais j'ai un problème pour y ajouter des JLabels. Ceux ci n'apparaissent pas !
C'est fun ! Mais il faut néanmoins ajouter un MouseListener à la fenêtre pour que le déplacement de la fenêtre fonctionne sous MacOS X, par exemple après la ligne : addMouseMotionListener(this);
addMouseListener(new MouseAdapter () { public void mousePressed(MouseEvent m) { mp = m.getPoint(); } });
Tu remarqueras aussi que si tu déplaces les autres fenêtres et que tu reviens dans ton appli Java, le fond n'est plus correct !
Pour le problème du label, c'est parce que tu redéfinis la méthode paint pour afficher le fond de la fenêtre ce qui change son comportement par défaut qui est justement d'afficher les composants de la fenêtre ! Je pense que tu devrais aller regarder du côté du JLayeredPane de l'instance JRootPane de ta fenêtre pour ajouter à ce JLayeredPane une instance de JLabel affichant en icône ton fond d'écran.
C'est pas très détaillé mais c'est juste pour te mettre sur la voie (du moins j'espère...)
Bye -- Emmanuel PUYBARET Email : Web : http://www.eteks.com Auteur du Cahier du programmeur Java [1] / Editions Eyrolles : http://www.eteks.com/services/cahierjava1.html
j'ai créé une fenêtre personnalisée (transparente, très jolie) mais j'ai un
problème pour y ajouter des JLabels. Ceux ci n'apparaissent pas !
C'est fun !
Mais il faut néanmoins ajouter un MouseListener à la fenêtre pour que le
déplacement de la fenêtre fonctionne sous MacOS X, par exemple après la
ligne :
addMouseMotionListener(this);
addMouseListener(new MouseAdapter ()
{
public void mousePressed(MouseEvent m)
{
mp = m.getPoint();
}
});
Tu remarqueras aussi que si tu déplaces les autres fenêtres et que tu
reviens dans ton appli Java, le fond n'est plus correct !
Pour le problème du label, c'est parce que tu redéfinis la méthode paint
pour afficher le fond de la fenêtre ce qui change son comportement par
défaut qui est justement d'afficher les composants de la fenêtre !
Je pense que tu devrais aller regarder du côté du JLayeredPane de l'instance
JRootPane de ta fenêtre pour ajouter à ce JLayeredPane une instance de
JLabel affichant en icône ton fond d'écran.
C'est pas très détaillé mais c'est juste pour te mettre sur la voie (du
moins j'espère...)
Bye
--
Emmanuel PUYBARET
Email : puybaret@eteks.com
Web : http://www.eteks.com
Auteur du Cahier du programmeur Java [1] / Editions Eyrolles :
http://www.eteks.com/services/cahierjava1.html
j'ai créé une fenêtre personnalisée (transparente, très jolie) mais j'ai un problème pour y ajouter des JLabels. Ceux ci n'apparaissent pas !
C'est fun ! Mais il faut néanmoins ajouter un MouseListener à la fenêtre pour que le déplacement de la fenêtre fonctionne sous MacOS X, par exemple après la ligne : addMouseMotionListener(this);
addMouseListener(new MouseAdapter () { public void mousePressed(MouseEvent m) { mp = m.getPoint(); } });
Tu remarqueras aussi que si tu déplaces les autres fenêtres et que tu reviens dans ton appli Java, le fond n'est plus correct !
Pour le problème du label, c'est parce que tu redéfinis la méthode paint pour afficher le fond de la fenêtre ce qui change son comportement par défaut qui est justement d'afficher les composants de la fenêtre ! Je pense que tu devrais aller regarder du côté du JLayeredPane de l'instance JRootPane de ta fenêtre pour ajouter à ce JLayeredPane une instance de JLabel affichant en icône ton fond d'écran.
C'est pas très détaillé mais c'est juste pour te mettre sur la voie (du moins j'espère...)
Bye -- Emmanuel PUYBARET Email : Web : http://www.eteks.com Auteur du Cahier du programmeur Java [1] / Editions Eyrolles : http://www.eteks.com/services/cahierjava1.html
Arnaud
Emmanuel Puybaret wrote:
j'ai créé une fenêtre personnalisée (transparente, très jolie) mais j'ai un problème pour y ajouter des JLabels. Ceux ci n'apparaissent pas !
C'est fun ! Mais il faut néanmoins ajouter un MouseListener à la fenêtre pour que le déplacement de la fenêtre fonctionne sous MacOS X
oui, c'est vrai. Ce code provient du lien sur le forum de sun que tu m'avais fait passer. Effectivement, pour améliorer la gestion de la transparence il faut rajouter un MouseListener et d'autres petits points de détail. Là c'était juste le mécanisme de base pour ne pas trop compliquer le code de mon exemple.
Tu remarqueras aussi que si tu déplaces les autres fenêtres et que tu reviens dans ton appli Java, le fond n'est plus correct !
C'est un problème qui est en partie résolu avec les versions plus avancées de ce code, mais il reste toujours un bug : si tu envoies le focus à ta fenêtre la transparence est gérée mais si tu iconifies par exemple une appli qui se trouvait sous ta fenêtre, le fond n'est pas mis à jour car il n'y a pas eu changement de focus (il faut cliquer sur l'écran pour perdre le focus sur ta fenêtre puis recliquer sur ta fenêtre pour actualiser le fond d'écran). C'est le seul défaut qui reste à la gestion de la transparence. Je n'ai pas réussi à le résoudre (j'ai essayé à peu près tous les WINDOW_EVENT_MASK et autres WINDOW_STATE_EVENT_MASK, rien n'y fait). L'idéal serait de pouvoir capter un signal de l'OS disant que qqchose à changé à l'écran (application iconifiée, fond d'écran changé, etc ... ), mais je ne sais pas si ce type de signal existe.
Pour le problème du label, c'est parce que tu redéfinis la méthode paint pour afficher le fond de la fenêtre ce qui change son comportement par défaut qui est justement d'afficher les composants de la fenêtre ! Je pense que tu devrais aller regarder du côté du JLayeredPane de l'instance JRootPane de ta fenêtre pour ajouter à ce JLayeredPane une instance de JLabel affichant en icône ton fond d'écran.
C'est pas très détaillé mais c'est juste pour te mettre sur la voie (du moins j'espère...)
Bye
Je vais jeter un coup d'oeil dans cette direction. J'ai aussi un bout de piste sur paintComponent() qui semble pas mal.
merci pour ton aide
A+
-- Arnaud
Emmanuel Puybaret wrote:
j'ai créé une fenêtre personnalisée (transparente, très jolie) mais j'ai
un problème pour y ajouter des JLabels. Ceux ci n'apparaissent pas !
C'est fun !
Mais il faut néanmoins ajouter un MouseListener à la fenêtre pour que le
déplacement de la fenêtre fonctionne sous MacOS X
oui, c'est vrai. Ce code provient du lien sur le forum de sun que tu m'avais
fait passer. Effectivement, pour améliorer la gestion de la transparence il
faut rajouter un MouseListener et d'autres petits points de détail. Là
c'était juste le mécanisme de base pour ne pas trop compliquer le code de
mon exemple.
Tu remarqueras aussi que si tu déplaces les autres fenêtres et que tu
reviens dans ton appli Java, le fond n'est plus correct !
C'est un problème qui est en partie résolu avec les versions plus avancées
de ce code, mais il reste toujours un bug : si tu envoies le focus à ta
fenêtre la transparence est gérée mais si tu iconifies par exemple une
appli qui se trouvait sous ta fenêtre, le fond n'est pas mis à jour car il
n'y a pas eu changement de focus (il faut cliquer sur l'écran pour perdre
le focus sur ta fenêtre puis recliquer sur ta fenêtre pour actualiser le
fond d'écran). C'est le seul défaut qui reste à la gestion de la
transparence. Je n'ai pas réussi à le résoudre (j'ai essayé à peu près tous
les WINDOW_EVENT_MASK et autres WINDOW_STATE_EVENT_MASK, rien n'y fait).
L'idéal serait de pouvoir capter un signal de l'OS disant que qqchose à
changé à l'écran (application iconifiée, fond d'écran changé, etc ... ),
mais je ne sais pas si ce type de signal existe.
Pour le problème du label, c'est parce que tu redéfinis la méthode paint
pour afficher le fond de la fenêtre ce qui change son comportement par
défaut qui est justement d'afficher les composants de la fenêtre !
Je pense que tu devrais aller regarder du côté du JLayeredPane de
l'instance JRootPane de ta fenêtre pour ajouter à ce JLayeredPane une
instance de JLabel affichant en icône ton fond d'écran.
C'est pas très détaillé mais c'est juste pour te mettre sur la voie (du
moins j'espère...)
Bye
Je vais jeter un coup d'oeil dans cette direction. J'ai aussi un bout de
piste sur paintComponent() qui semble pas mal.
j'ai créé une fenêtre personnalisée (transparente, très jolie) mais j'ai un problème pour y ajouter des JLabels. Ceux ci n'apparaissent pas !
C'est fun ! Mais il faut néanmoins ajouter un MouseListener à la fenêtre pour que le déplacement de la fenêtre fonctionne sous MacOS X
oui, c'est vrai. Ce code provient du lien sur le forum de sun que tu m'avais fait passer. Effectivement, pour améliorer la gestion de la transparence il faut rajouter un MouseListener et d'autres petits points de détail. Là c'était juste le mécanisme de base pour ne pas trop compliquer le code de mon exemple.
Tu remarqueras aussi que si tu déplaces les autres fenêtres et que tu reviens dans ton appli Java, le fond n'est plus correct !
C'est un problème qui est en partie résolu avec les versions plus avancées de ce code, mais il reste toujours un bug : si tu envoies le focus à ta fenêtre la transparence est gérée mais si tu iconifies par exemple une appli qui se trouvait sous ta fenêtre, le fond n'est pas mis à jour car il n'y a pas eu changement de focus (il faut cliquer sur l'écran pour perdre le focus sur ta fenêtre puis recliquer sur ta fenêtre pour actualiser le fond d'écran). C'est le seul défaut qui reste à la gestion de la transparence. Je n'ai pas réussi à le résoudre (j'ai essayé à peu près tous les WINDOW_EVENT_MASK et autres WINDOW_STATE_EVENT_MASK, rien n'y fait). L'idéal serait de pouvoir capter un signal de l'OS disant que qqchose à changé à l'écran (application iconifiée, fond d'écran changé, etc ... ), mais je ne sais pas si ce type de signal existe.
Pour le problème du label, c'est parce que tu redéfinis la méthode paint pour afficher le fond de la fenêtre ce qui change son comportement par défaut qui est justement d'afficher les composants de la fenêtre ! Je pense que tu devrais aller regarder du côté du JLayeredPane de l'instance JRootPane de ta fenêtre pour ajouter à ce JLayeredPane une instance de JLabel affichant en icône ton fond d'écran.
C'est pas très détaillé mais c'est juste pour te mettre sur la voie (du moins j'espère...)
Bye
Je vais jeter un coup d'oeil dans cette direction. J'ai aussi un bout de piste sur paintComponent() qui semble pas mal.
merci pour ton aide
A+
-- Arnaud
Arnaud
j'ai trouvé la solution (plus bête, y'a pas) :
il suffit de rajouter une ligne à la fin du paint() : label1.paint(g);
et voilà !
Des fois, on se complique vraiment la vie pour rien !
-- Arnaud
j'ai trouvé la solution (plus bête, y'a pas) :
il suffit de rajouter une ligne à la fin du paint() :
label1.paint(g);
et voilà !
Des fois, on se complique vraiment la vie pour rien !
il suffit de rajouter une ligne à la fin du paint() : label1.paint(g);
et voilà !
Des fois, on se complique vraiment la vie pour rien !
-- Arnaud
Arnaud
Arnaud wrote:
j'ai trouvé la solution (plus bête, y'a pas) :
il suffit de rajouter une ligne à la fin du paint() : label1.paint(g);
et voilà !
Des fois, on se complique vraiment la vie pour rien !
-- Arnaud
ça ne marche pas si bien que ça en fait : à partir de 2 labels, ils se chevauchent (ils sont peints au même endroit, qui ne correspond pas en plus au Layout spécifié).
Bon, je vais m'y remettre :(
-- Arnaud
Arnaud wrote:
j'ai trouvé la solution (plus bête, y'a pas) :
il suffit de rajouter une ligne à la fin du paint() :
label1.paint(g);
et voilà !
Des fois, on se complique vraiment la vie pour rien !
--
Arnaud
ça ne marche pas si bien que ça en fait : à partir de 2 labels, ils se
chevauchent (ils sont peints au même endroit, qui ne correspond pas en plus
au Layout spécifié).
il suffit de rajouter une ligne à la fin du paint() : label1.paint(g);
et voilà !
Des fois, on se complique vraiment la vie pour rien !
-- Arnaud
ça ne marche pas si bien que ça en fait : à partir de 2 labels, ils se chevauchent (ils sont peints au même endroit, qui ne correspond pas en plus au Layout spécifié).