IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Un problème de Robot!


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé Avatar de kayzra
    Inscrit en
    Novembre 2006
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 110
    Par défaut Un problème de Robot!
    Bonjour, je souhaite que mon JPanel affiche une capture dynamique de ce qui ce trouve derrière lui, en gros imiter la transparence!

    Le problème c'est que je n'arrive à afficher que le coin en haut à gauche de mon écran et je ne comprend pas trop pourquoi, si une âme secourable pouvais m'aider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
     
    import java.awt.AWTException;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    import java.awt.Robot;
    import java.awt.image.BufferedImage;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.WindowConstants;
     
    public class FrameTransparente extends JFrame 
     
        public FrameTransparente() {
            pack();
            setSize(400, 400);
            setLocationRelativeTo(null);
            setContentPane(new panCapture());
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        }
     
        public static void main(String[] args) {
     
            new FrameTransparente().setVisible(true);
     
        }
     
     
      class panCapture extends JPanel {
     
     
        public panCapture() {
        }
     
        @Override
        public void paintComponent(Graphics g) {
            try {
                Robot robot = new Robot();
                BufferedImage image = robot.createScreenCapture(new Rectangle(this.getX(), this.getY(), this.getWidth(), this.getHeight()));
                g.drawImage(image, this.getX(), this.getY(), this);
                repaint();
            } catch (AWTException ex) {
                System.out.println(ex);
            }
        }
      }
     
    }

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Il faut utiliser une autre version du drawImage couplé au méthodes getLocationOnScreen, getWidth et getHeight de ton JPanel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.drawImage(img, 0,0,getWidth(),getHeight(),getLocationOnScreen().x,getLocationOnScreen().y,getLocationOnScreen().x+getWidth(),getLocationOnScreen().y+getHeight(),null);

  3. #3
    Membre chevronné Avatar de xixi31
    Inscrit en
    Juin 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2005
    Messages : 423
    Par défaut
    Le problème, c'est que tu prends une capture d'écran alors que ta frame est visible à l'écran, donc, tu vas retrouver ta frame dans l'image...

  4. #4
    Membre éclairé Avatar de biozaxx
    Profil pro
    Inscrit en
    Août 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 403
    Par défaut
    Robot robot = new Robot();
    BufferedImage image = robot.createScreenCapture(new Rectangle(this.getX(), this.getY(), this.getWidth(), this.getHeight()));
    tu restes dans le coin en haut a gauche car tu prends pour coordonnées this.getX et this.getY or ceci correspond a la position de ton panel dans ta frame soit 0,0

    il faut que tu prennes les coordonnées de la frame (en la passant en parametre par exemple ou bien en appelant 3 fois getparent() dans ton cas)

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    En ce qui concerne ma version elle se base sur une capture intégrale de l'écran, j'avais oublié de le préciser

  6. #6
    Membre confirmé Avatar de kayzra
    Inscrit en
    Novembre 2006
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 110
    Par défaut
    Merci pour votre aide, j'ai donc modifier ma class ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
     
    import java.awt.AWTException;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    import java.awt.Robot;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.image.BufferedImage;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.WindowConstants;
     
    public class FrameTransparente extends JFrame {
     
     
        BufferedImage image;
     
        public FrameTransparente() {
            pack();
            setSize(400, 400);
            setLocationRelativeTo(null);
            setContentPane(new panCapture());
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            setVisible(true);
        }
     
     
     
        public void screenCapture() {
            try{
                setVisible(false);
                Robot robot = new Robot();
                image = robot.createScreenCapture(new Rectangle(java.awt.Toolkit.getDefaultToolkit().getScreenSize()) );
                setVisible(true);
            }catch(AWTException ex) {
                System.out.println(ex);
            }
        }
     
        public BufferedImage getImage() {
            return image;
        }
     
     
        public static void main(String[] args) {
     
            new FrameTransparente();
     
        }
     
     
    class panCapture extends JPanel {
     
     
     
     
        public panCapture() {
            addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent e) {
                    screenCapture();
                }
            });
            screenCapture();
        }
     
     
        @Override
        public void paintComponent(Graphics g) {
            g.drawImage(getImage(), 0,0,getWidth(),getHeight(),getLocationOnScreen().x,getLocationOnScreen().y,getLocationOnScreen().x+getWidth(),getLocationOnScreen().y+getHeight(),null);
            repaint();
     
        }
    }
     
    }
    Ça à l'air de fonctionner hormis un faible tremblement de l'image lors des déplacements et parfois une image fantome de la JFrame...
    En tout cas, merci encore

  7. #7
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Enlèves l'appel à repaint dans la méthode paintComponent, celà peut amener à des problèmes de boucle infinie (car repaint peut amner à un appel de la méthode paintComponent)

  8. #8
    Membre confirmé Avatar de kayzra
    Inscrit en
    Novembre 2006
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 110
    Par défaut
    Merci sinok, c'est fait!
    Par contre, j'ai 2 autres petits problèmes :

    Je voudrai savoir si il y aurait pas un moyen de détecter un changement au niveau de l'écran (ex:ouverture d'une nouvelle fenêtre d'application ou changement de position d'un élément du bureau) afin de mettre à jour le BufferedImage à ce moment là et simuler correctement la transparence tout le temp?

    De plus, j'utilise désormais une JWindows afin de ne pas avoir accés à mon applie dans la barre des taches. Je souhaiterai savoir si il est possible de faire en sorte que ma JWindow reste en arrière plan, la méthode setAlwaysOnTop(false) ne fonctionne pas avec JWindow?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    import java.awt.AWTException;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    import java.awt.Robot;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.image.BufferedImage;
    import java.util.Timer;
    import java.util.TimerTask;
    import javax.swing.JPanel;
    import javax.swing.JWindow;
     
    public class FrameTransparente extends JWindow {
     
     
        private BufferedImage image;
        private long updateTime;        //CF: LIGNE 67
        private Timer timer;            //CF: LIGNE 67
        private TimerTask tache;        //CF: LIGNE 67
     
        public FrameTransparente() {
            pack();
            setSize(400, 400);
            setLocationRelativeTo(null);
            setContentPane(new panCapture());
            setVisible(true);
        }
     
     
     
        public void screenCapture() {
            try{
                setVisible(false);
                Robot robot = new Robot();
                image = robot.createScreenCapture(new Rectangle(java.awt.Toolkit.getDefaultToolkit().getScreenSize()) );
                setVisible(true);
            }catch(AWTException ex) {
                System.out.println(ex);
            }
        }
     
        public BufferedImage getImage() {
            return image;
        }
     
     
        public static void main(String[] args) {
     
            new FrameTransparente();
     
        }
     
     
    class panCapture extends JPanel {
     
     
     
     
        public panCapture() {
     
            addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    screenCapture();
                }
            });
            /******************************************************************************
             * J'AI ESSAYE DE CREER UN TIMER AFIN DE METTRE A JOUR REGULIEREMENT
             * LE BUFFEREDIMAGE, MAIS CELA ENTRAINE UN CLIGNOTEMENT DUE AU FAIT QUE JE CACHE 
             * LA FENETRE AVANT DE PREND UNE CAPTURE, SANS ÇA JE N'EST PAS UNE BONNE 
             * TRANSPARENCE DE LA JWINDOWS!!!
             ******************************************************************************/ 
            updateTime = 1000;
            timer = new Timer();
            tache = new TimerTask() {
                @Override
                public void run() { 
                    setVisible(false);  // On cache la fenetre
                    screenCapture();    // On fait une capture
                    setVisible(true);   // la fenetre peut redevenir visible
                }
            };
            timer.scheduleAtFixedRate(tache,0,updateTime);
        }
     
     
        @Override
        public void paintComponent(Graphics g) {
            g.drawImage(getImage(),
                    0,0,
                    getWidth(),getHeight(),
                    getLocationOnScreen().x,getLocationOnScreen().y,
                    getLocationOnScreen().x+getWidth(),getLocationOnScreen().y+getHeight(),
                    null);
        }
    }
     
    }

  9. #9
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Pour le background la seule chose que tu peux faire est d'utiliser un Tread ouj un timer Swing qui refait une capture de l'écran toutes les x millisecondes, pas moyen de détecter s'il s'est passé quelquechose dans une autre appli (éventuellement voir du coté de la perte de focus - WindowFocusListener)

    L'autre moyen est de rendre réellement ta JWindow transparente en utilisant JNA

    Par contre gérér une mise en fond automatique, là je ne vois pas

  10. #10
    Membre confirmé Avatar de kayzra
    Inscrit en
    Novembre 2006
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 110
    Par défaut
    merci sinok , je crois que je vais peut être faire avec JNA

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec Robot
    Par einboubou dans le forum Langage
    Réponses: 2
    Dernier message: 12/08/2009, 14h23
  2. [GD] Anti-robot : problème de lecture
    Par Rocknacro dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 15/02/2008, 14h04
  3. Routeur U.S. Robotics : problème redirection de port
    Par webrider dans le forum Hardware
    Réponses: 1
    Dernier message: 11/08/2006, 15h01
  4. [ROBOT] Des problèmes ?
    Par BiM dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 4
    Dernier message: 07/08/2006, 12h12
  5. problème class robot
    Par groupe51 dans le forum Interfaces Graphiques en Java
    Réponses: 8
    Dernier message: 29/05/2006, 13h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo