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

2D Java Discussion :

Dessiner sur un Component


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Par défaut Dessiner sur un Component
    Bonjour à tous,

    J'aimerai savoir comment faire pour dessiner sur un component, en fait j'y arrive mais mon dessin ne reste pas il disparait automatiquement et je ne vois pas pourquoi.

    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
    100
    101
    102
    103
    104
    105
    106
     
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GraphicsEnvironment;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
     
    import javax.media.Manager;
    import javax.media.MediaLocator;
    import javax.media.Player;
    import javax.swing.JFrame;
     
     
    public class test extends JFrame {
     
    	// Dimensions d'écran
    	private GraphicsEnvironment graphicsEnvironment = null;
     
    	// Component video
    	private Component video = null;
     
    	// Player
    	private Player player = null;
    	private MediaLocator ml = null;
     
    	public test() {
    		super("Test");
    		graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
    		setBounds(graphicsEnvironment.getMaximumWindowBounds());
    		setVisible(true);
    		addWindowListener(new WindowAdapter() {
    			public void windowClosing(WindowEvent e) {
    				closePlayer();
    				System.exit(0);
    			}
    		});
     
    		init();
    	}
     
    	public void init()
    	{
    		//récupération de mon player
    		getPlayer();
    		//ajout de mon player à ma frame
    		add(video);
    		video.setBounds(graphicsEnvironment.getMaximumWindowBounds());
    		//ajout d'un événement souris pour le dessin
    		video.addMouseListener(new Click());
    		// actualisation de ma fenêtre
    		repaint();
    	}
     
    	//Methode dessinant une ligne en diagonal 
    	public void superPose()
    	{
    		Graphics g = player.getVisualComponent().getGraphics(); 
    		Graphics2D g2 = (Graphics2D) g;
     
    		g2.setPaint(Color.green);
    		g2.drawLine(0, 0, 300, 300);
    	}
     
    	//Methode utilisé pour la récupération de mon player
    	public void getPlayer() {
    		ml = new MediaLocator("vfw://0");
    		try {
    			player = Manager.createRealizedPlayer(ml);
    			player.start();
    			video = player.getVisualComponent();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
     
    	//Méthode utilisé pour fermer mon player
    	public void closePlayer() {
    		player.close();
    		player.deallocate();
    	}
     
    	public static void main(String args[]) {
    		new test();
    	}
     
    	//Clazs événement souris(dessine ma ligne sur un simple click)
    	public class Click implements MouseListener {
     
    		public void mouseClicked(MouseEvent arg0) {
    			superPose();
    		}
     
    		public void mouseEntered(MouseEvent arg0) {}
     
    		public void mouseExited(MouseEvent arg0) {}
     
    		public void mousePressed(MouseEvent arg0) {}
     
    		public void mouseReleased(MouseEvent arg0) {}
    	}
     
    }
    MERCI....

  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
    Pour dessiner de façon durable sur un JComponent, il ne faut pas passer par getGraphics mais par une redéfinition de la méthode paintComponent

    Dans ton cas le plus simple serait de mettre un composant effectuant le dessin voulu dans le glassPane (qui est la couche supérieur de ta JFrame):

    Un petiti exemple:

    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
     
    import java.awt.AlphaComposite;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
     
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
     
    public class MyGlassPane extends JComponent {
     
     
     
        @Override
        protected void paintComponent(Graphics arg0) {
            // TODO Auto-generated method stub
            super.paintComponent(arg0);
            Graphics2D g2d = (Graphics2D) arg0.create(); 
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
            g2d.setColor(new Color(20,20,70));
            g2d.fillRoundRect(10, 10, getWidth()-20, getHeight()-20, 30,30);
     
        }
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            JFrame f = new JFrame();
            JPanel p = new JPanel();
            p.setBackground(Color.yellow);
            JButton b = new JButton("toto");
            f.add(b, BorderLayout.SOUTH);
            f.add(p);
            f.setGlassPane(new MyGlassPane());
            f.getGlassPane().setVisible(true);
            f.setSize(300,300);
            f.setLocationRelativeTo(null);
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setVisible(true);
        }
     
    }
    Donne le résultat suivant dans lequel on voit bien que le rectangle est dessiné par dessus le JPanel et le JButton qui se trouvent dans la JFrame:
    Images attachées Images attachées  

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Par défaut Marche pas...
    Salut sinok,

    Tout d'abord merci pour ta réponse je l'ai testé et elle fonctionne très bien cependant j'ai enlevé le Jpanel pour le remplacer par mon Player et rien a faire le player est toujour au premier plan.

    Modif efféctué :
    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
    public static void main(String[] args) {
            // TODO Auto-generated method stub
            JFrame f = new JFrame();
            Component video = null;
            MediaLocator ml = new MediaLocator("vfw://0");
    		try {
    			Player player = Manager.createRealizedPlayer(ml);
    			player.start();
    			video = player.getVisualComponent();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
     
            JButton b = new JButton("toto");
            f.add(b, BorderLayout.SOUTH);
     
            f.add(video);
            f.setGlassPane(new MyGlassPane());
            f.getGlassPane().setVisible(true);
            f.setSize(300,300);
            f.setLocationRelativeTo(null);
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setVisible(true);
        }

  4. #4
    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
    Et là tu peux dire un bon gros merci très ironique à JMF qui utilise un composant AWT et non Swing...
    Et comme les composants AWT sont HeavyWeight, il te bouffent le glassPane de ta JFrame...

    Et là par contre je ne suis pas franchement grand connaisseur en AWT..

    Par contre il est possible de modifier le comportement de JMF pour qu'il produise un composant lightweight compatible avec Swing, et ce de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, new Boolean(true));
    Il faut placer ce code avant de créer le player
    Essaie pour voir ce que çà donne...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Par défaut
    Rien à faire le résultat est le même

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Par défaut Essayons de regarder ailleur
    Bonjour tout le monde,

    C'est encore moi n'ayant toujours pas trouvé ma solution je me demandais s'il n'y avait pas un moyen de contourner mon problème je m'explique, je m'acharne à essayer de dessiner sur un composant AWT et je n'y arrive pas, ne serait il pas possible de superposer un autre objet sur celui-ci si oui quelqu'un pourrait-il m'orienter.

    A autre chose est ce qu'il existe autre chose que JMF pour faire de d'acquisition vidéo?

    MERCI...

Discussions similaires

  1. [MFC] Dessiner sur un Owner Draw
    Par gwendo dans le forum MFC
    Réponses: 1
    Dernier message: 27/04/2005, 11h21
  2. Comment dessiner sur un Bitmap sans scintillement ?
    Par TOTO32 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 10/01/2005, 10h11
  3. [Servlet] [Image] Dessiner sur une image
    Par gaia_dev dans le forum 2D
    Réponses: 5
    Dernier message: 01/09/2004, 17h11
  4. [Transparent] - Comment dessiner sur 2 TImage ?
    Par TOTO32 dans le forum Langage
    Réponses: 15
    Dernier message: 08/08/2004, 01h06
  5. Dessiner sur un Tbutton
    Par rvzip64 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/06/2004, 09h06

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