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 :

Dessiner au premier plan


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 133
    Par défaut Dessiner au premier plan
    Bonsoir,

    J'ai un problème concernant les plans d'un dessin que je réalise.
    Mon image est un cadre en sang (donc des gouttes qui vont vers le bas ...) et quand je le dessine ça se coupe car c'est autour d'un JPanel, mais j'aimerais dessiner mon image AU-DESSUS de mon JPanel, mais je ne trouve pas de réponse sur le net concernant mon problème, et même si c'est possible ...

    Merci d'avance pour ceux qui pourront m'éclairer !

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Neewd Voir le message
    ça se coupe
    Où, comment, screenshot, et code utilisé stp.

    j'aimerais dessiner mon image AU-DESSUS de mon JPanel
    Tu veux dire en supperposition de tout ce qui est dans le panel? Il suffit de surcharger la méthode paint de ton jpanel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void paint(Graphics g){
       super.paint(g); // travail habituel
       dessinerImage(g); // ton dessin.
    }

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 133
    Par défaut
    Oui c'est exactement, je veux que ce soit en superposition de tout mon Panel.
    J'ai utilisé directement un JPanel, faut-il que je créer une classe étendnat JPanel pour pouvoir surcharger la méthode paint ?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    la méthode paint(Graphics g) de JPanel est chargé de dessiner son contenu.
    Entre autres, elle appelle une autre méthode, paintChildren(Graphics g) chargée de dessiner les composants ajoutés au panel. il suffit de surcharger cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    protected void paintChildren(Graphics g) {{
    super.paintChildren(g);
    }
    Tout ce que tu dessines avant l'appel de super, se dessine derrière les composants.
    Tout ce que tu dessines après l'appel de super, se dessine devant.

    Le code suivant illustre ça :
    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
    public class DemoDrawOverPanel extends JPanel {
     
    	public DemoDrawOverPanel() {
    	}	
     
    	@Override
    	protected void paintChildren(Graphics g) {
     
    		Dimension size = getSize();
    		g.setColor(Color.GREEN);
    		int width=(int)(Math.min( size.getWidth(), size.getHeight())/4);
    		int squareWidth=2*width/3;
    		int squareOffset=(width-squareWidth)/2;
    		for( int x=0; x<size.getWidth(); x+=width) {
    			for( int y=0; y<size.getHeight(); y+=width) {
    				g.fillRect(x+squareOffset, y+squareOffset, squareWidth, squareWidth); // ces carrés seront dessinés derrière
    			}
    		}
    		super.paintChildren(g);
    		g.setColor(Color.RED);
    		int circleWidth=width/2;
    		int circleOffset=(width-circleWidth)/2;
    		for( int x=0; x<size.getWidth(); x+=width) {
    			for( int y=0; y<size.getHeight(); y+=width) {
    				g.fillOval(x+circleOffset, y+circleOffset, circleWidth, circleWidth); // ces cercles seront dessinés devant
    			}
    		}
     
     
    	}
     
    	private final static int GRIDX=30;
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
    		frame.setLocationRelativeTo(null);
     
    		final DemoDrawOverPanel panel = new DemoDrawOverPanel();
     
    		panel.setLayout(new GridLayout(GRIDX, GRIDX));
    		for(int i=GRIDX*GRIDX;i>0; i--) {
    			JLabel label = new JLabel("Texte");
    			panel.add(label);
    		}
     
    		frame.getContentPane().add(panel);
     
    		frame.setVisible(true);
     
    	}
     
    }
    Maintenant, dans ton cas, il faut dessiner une image au dessus : le problème c'est qu'une image va se dessiner sur l'ensemble de sa surface, et donc masquer ton panel entièrement pour peu qu'elle fasse la taille de ton panel.

    Il y a plusieurs solutions pour gérer ça :
    1) clipper : c'est à dire définir une zone ou l'image ne se dessinera pas : elle laissera donc ce qu'il y avait dessiner avant dans la partie. En quelque sort, c'est comme si on découpait un trou dans l'image...
    La difficulté de ça, c'est de définir la zone de clipping : s'il s'agit d'un rectangle (comme pour un cadre en bois), c'est facile, du moins si on a les dimensions du cadre.
    J'imagine que découper une zone qui suit les contours de tes gouttes est loin d'être évident (pas infaisable, mais pas facile)

    2) utiliser une image transparente

    certains formats d'images, comme gif ou png, permettent d'avoir des zones transparentes, les parties transparentes pouvant être considérées comme trous

    java gère très bien l'affichage de ces images, en laissant l'arrière plan visible dans les trous

    Tu peux transformer ton cadre ensanglanté en image transparente (avec photoshop ou paintshop ou gimp

    Voilà un exemple qui illustre ça (l'image est en pièce jointe) :
    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
    public class DemoDrawImageOver extends JPanel {
     
    	private final static Image cadre;
     
    	static {
    		cadre = readImage("sang.png");
    	}
     
    	public DemoDrawImageOver() {
    	}	
     
    	@Override
    	protected void paintChildren(Graphics g) {
     
    		super.paintChildren(g);
     
    		Graphics2D gr = (Graphics2D) g;
     
    		Dimension size = getSize();
     
    		gr.drawImage(cadre,0,0, (int)size.getWidth(), (int)size.getHeight(), this);	
    	}
     
    	private final static int GRIDX=30;
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
    		frame.setLocationRelativeTo(null);
     
    		final DemoDrawImageOver panel = new DemoDrawImageOver();
     
    		panel.setLayout(new GridLayout(GRIDX, GRIDX));
    		for(int i=GRIDX*GRIDX;i>0; i--) {
    			JLabel label = new JLabel("Texte");
    			panel.add(label);
    		}
     
    		frame.getContentPane().add(panel);
     
    		frame.setVisible(true);
     
    	}
     
    	private static BufferedImage readImage(String filename) {
    		try {
    			return ImageIO.read(DemoDrawImageOver.class.getResource(filename));
    		} catch (IOException e) {
    			e.printStackTrace();
    			return null;
    		}
    	}
     
    }
    3) il y a d'autres méthodes, en combinant l'image avec un masque par exemple ou en traitant par le code les couleurs de ton images pour "générer le trou" en modifiant l'alpha de l'image, etc... mais ce sont des méthodes plus compliquées.
    Images attachées Images attachées  
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 133
    Par défaut
    Merci beaucoup j'ai trouvé une solution maintenant je pense

    Par contre pour effacer ce cadre après l'avoir dessiné, comment c'est possible ?

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Neewd Voir le message
    Merci beaucoup j'ai trouvé une solution maintenant je pense

    Par contre pour effacer ce cadre après l'avoir dessiné, comment c'est possible ?

    J'ai répondu à une question similaire sur cette discussion, hier...

    Voici l'exemple de mon post précédent modifié pour le sang "s'efface" au bout de 3 secondes

    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
    public class DemoDrawImageOver extends JPanel {
     
    	private final static Image cadre;
     
    	static {
    		cadre = readImage("sang.png");
    	}
     
    	private boolean drawImage;
     
    	public DemoDrawImageOver() {
    		drawImage=true;
    	}	
     
    	public void setDrawImage(boolean drawImage) {
    		if( this.drawImage!=drawImage){
    			this.drawImage = drawImage;
    			repaint();
    		}
    	}
     
    	@Override
    	protected void paintChildren(Graphics g) {
     
    		super.paintChildren(g);
     
    		if( drawImage ) {
    		Dimension size = getSize();
     
    		g.drawImage(cadre,0,0, (int)size.getWidth(), (int)size.getHeight(), this);	
     
    		}
    	}
     
    	private final static int GRIDX=30;
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
    		frame.setLocationRelativeTo(null);
     
    		final DemoDrawImageOver panel = new DemoDrawImageOver();
     
    		panel.setLayout(new GridLayout(GRIDX, GRIDX));
    		for(int i=GRIDX*GRIDX;i>0; i--) {
    			JLabel label = new JLabel("Texte");
    			panel.add(label);
    		}
     
    		frame.getContentPane().add(panel);
    		frame.addWindowListener(new WindowAdapter() {
     
    			@Override
    			public void windowOpened(WindowEvent e) {
    				new Thread() {
    					public void run() {
    						try {
    							sleep(3000);
    							panel.setDrawImage(false);
    						} catch (InterruptedException e) {
    						}
    					};
    				}.start();
    			}
    		});
    		frame.setVisible(true);
     
    	}
     
    	private static BufferedImage readImage(String filename) {
    		try {
    			return ImageIO.read(DemoDrawImageOver.class.getResource(filename));
    		} catch (IOException e) {
    			e.printStackTrace();
    			return null;
    		}
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  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
    Un JLayer entourant le composant serait peut être une solution plus générique et aisément réutilisable.

    http://docs.oracle.com/javase/7/docs...ng/JLayer.html

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

Discussions similaires

  1. [PPT-2003] Affichage en premier plan les elements de la barre de dessin
    Par Alexandra 01 dans le forum VBA PowerPoint
    Réponses: 14
    Dernier message: 20/07/2010, 19h37
  2. Dessiner au premier plan
    Par hpalpha dans le forum Composants VCL
    Réponses: 2
    Dernier message: 01/11/2008, 16h13
  3. dessiner au premier plan
    Par Invité dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 06/07/2006, 22h30
  4. [Visual C# 2005 Express]Dessin au premier plan
    Par oiffrig dans le forum Windows Forms
    Réponses: 5
    Dernier message: 12/11/2005, 18h35
  5. forcer une fenetre à etre au premier plan jusqu'a ...
    Par peppena dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 22/12/2003, 16h14

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