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 :

Supprimer un draw sur Graphics2D


Sujet :

2D Java

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 12
    Points
    12
    Par défaut Supprimer un draw sur Graphics2D
    Bonjour,

    Voilà j'ai longtemps cherché sur Internet et je n'ai pas trouvé de solution.

    J'ai un Graphics2D où dedans je fais un drawImage(). J'aimerai redessiner une image dessus sachant que :
    - Si je refais drawImage(), les 2 images vont être dessus (et avec la transparence sur les images, on voit toujours la première);
    - Je veux garder le fond (qui a plusieurs couleurs différente) donc le drawRect me met des fonds blancs ou noir que je ne désire pas.
    - Je ne peux pas faire drawImage(image1); puis drawImage(fond); drawImage(image2); car le fond peut bouger.

    Donc après avoir réfléchit un long moment et après avoir recherché, je ne vois qu'une seule solution : supprimer la première image et dessiner la 2ème. Seulement voilà, je n'ai pas vu sur internet comment faire pour vraiment supprimer un draw.

    Auriez-vous une solution ?

    Merci.

  2. #2
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Lorsqu'on dessine un composant AWT(donc SWING), on ne dessine pas comme sur du papier : les instructions de dessin sont exécutées à nouveau à chaque fois que c'est nécessaire (par exemple quand on redimensionne la fenêtre). Il faut donc considérer que le dessin qu'on fait correspond à un état et qu'on ne sait pas quand il sera dessiné.

    Donc "on n'efface pas un draw" : on dessine ou on dessine pas.

    Si pour un certain état tu dois dessiner 2 images et un autre 1 seule, il faut qu'il y'ait juste un if :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    si ( etat ) {
       dessine image 1
       dessine image 2
    } sinon
    {
       dessine image 1
    }
    Si je comprends bien tu veux dessiner d'abord une image, puis ensuite une autre image.

    Dans ce cas, il suffit de faire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    si ( dessinerImage2 ) {
       dessine image 2
    } sinon
    {
       dessine image 1
    }
    ou dessinerImage2 est un état booléen donc en java une variable de classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private boolean dessinerImage2=false;
    à un moment donné tu vas changer cet état (je n'ai pas compris quand tu voulais faire ça, mais peu importe) :

    Il faudra prévenir ton composant que tu as changé l'état qui influe sur le dessin : si aucun évènement qui doit se traduire par un redessin se déclenche (comme redimensionner la fenêtre par exemple), ce qui est affiché ne changera pas.
    Pour avertir le composant qu'il doit se redessiner, on appelle repaint() sur le composant.
    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.

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Je comprends bien ce que tu me dis, mais alors les 2 images dessiner vont être surperposé, et vu qu'il y a de la transparence, on verra le fond, l'image1 et l'image 2 au lieu de seulement le fond et l'image 2. C'est l'effet qui se produit qu'on on apelle 2 fois drawImage()


    EDIT : En fait j'ai résolu mon problème en créant 4 Graphics2D différents et en n'affichant qu'un Graphics2D dans mon BuferredImage pour n'afficher qu'une image, merci.

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Aureroy Voir le message
    Je comprends bien ce que tu me dis, mais alors les 2 images dessiner vont être surperposé, et vu qu'il y a de la transparence, on verra le fond, l'image1 et l'image 2 au lieu de seulement le fond et l'image 2. C'est l'effet qui se produit qu'on on apelle 2 fois drawImage()
    euh...non...

    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
    public class DemoDrawImg extends JPanel {
     
    	private final static Image image1;
    	private final static Image image2;
    	private final static TexturePaint bg;
     
    	static {
    		image1 = readImage("vangogh.jpg");
    		image2 = readImage("cezanne.jpg");
    		BufferedImage bgimage = readImage("bg.jpg");
    		bg = bgimage==null?null:new TexturePaint(bgimage, new Rectangle(0,0,45,45));
    	}
     
     
    	private boolean drawImage2=false;
     
    	public DemoDrawImg() {
    	}	
     
    	public void toggleImage() {
    		drawImage2=!drawImage2;
    		repaint();
    	}
     
    	@Override
    	public void paint(Graphics g) {
     
    		Graphics2D gr = (Graphics2D) g;
    		Dimension size = getSize();
     
    		gr.setPaint(bg);
    		g.fillRect(0, 0, (int)size.getWidth(), (int)size.getHeight());
     
    		gr.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
     
    		double width = size.width;
    		double height = size.height;
     
    		Image image=drawImage2?image1:image2;
     
    		double imgwidth=image.getWidth(this);
    		double imgheight=image.getHeight(this);
    		double coef = Math.min(width/imgwidth,height/imgheight);
    		coef/=1.5;
    		imgwidth*=coef;
    		imgheight*=coef;
    		gr.drawImage(image, (int)(size.width-imgwidth)/2, (int)(size.height-imgheight)/2, (int)(imgwidth), (int)(imgheight), this);
     
    	}
     
    	public static void main(String[] args) {
     
    		if (image1==null || image2==null || bg==null ) {
    			System.err.println("Erreur: image non trouvée");
    			return;
    		}
     
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
    		frame.setLocationRelativeTo(null);
     
    		final DemoDrawImg panel = new DemoDrawImg();
     
    		frame.getContentPane().add(panel);
     
    		frame.addWindowListener(new WindowAdapter() {
     
    			private Thread thread;
     
    			public void windowOpened(WindowEvent e) {
    				thread = new Thread() {
    					public void run() {
    					    do {
    							try {
    								sleep(1000);
    								panel.toggleImage();
    							} catch (InterruptedException e) {
    							}
    						} while (!interrupted());	
    					}
    				};
    				thread.start();
    			}
     
    			@Override
    			public void windowClosed(WindowEvent e) {
    				thread.interrupt();
    			}
    		});
     
    		frame.setVisible(true);
     
    	}
     
    	private static BufferedImage readImage(String filename) {
    		try {
    			return ImageIO.read(DemoDrawImg.class.getResource(filename));
    		} catch (IOException e) {
    			e.printStackTrace();
    			return null;
    		}
    	}
     
    }
    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.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/06/2006, 08h05
  2. [10gR1] supprimer un .fmx sur un serveur Win2003
    Par Magnus dans le forum Oracle
    Réponses: 8
    Dernier message: 23/04/2006, 00h13
  3. Comment supprimer un verrou sur une table ?
    Par Laure13 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/03/2006, 15h10
  4. est-il possible de supprimer un fichier sur le serveur ?
    Par NoobX dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/10/2005, 14h54
  5. supprimer les interlignes sur ie
    Par samourai_alex dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 30/07/2005, 17h29

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