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

Composants Java Discussion :

[JDesktopPane] Redimensionner d'une image


Sujet :

Composants Java

  1. #1
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut [JDesktopPane] Redimensionner d'une image
    Bonjour à vous

    Voici mon problème. Dans le code suivant, j'insère une image qui est censée servir de background à un JDesktopPane :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private JDesktopPane getJDesktopPane() {
    		if (jDesktopPane == null) {
    			jDesktopPane = new JDesktopPane();
    			try{
    				java.net.URL url = getClass().getResource("toto.png");
    				java.awt.image.BufferedImage image = javax.imageio.ImageIO.read(url);
    				jDesktopPane.setBorder(new CentredBackgroundBorder(image));
    			}
    			catch(java.net.MalformedURLException murle){ murle.printStackTrace(); }
    			catch(java.io.IOException ioe){ ioe.printStackTrace(); }
    		}
    		return jDesktopPane;
    	}
    Voici la classe annexe qui me permet d'effectuer cette opération:
    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
     
    package com.bioxpr.gui;
     
    import javax.swing.border.Border;
    import java.awt.*;
    import java.awt.image.BufferedImage;
     
    public class CentredBackgroundBorder implements Border {
     
    	private final BufferedImage image;
     
    	public CentredBackgroundBorder(BufferedImage image) {
    		this.image = image;
    	}
     
    	public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
    		/*int x0 = x + (width-image.getWidth())/2;
    		int y0 = y + (height-image.getHeight())/2;*/
    		int x0 = 0;
    		int y0 = 0;
    		g.drawImage(image, x0, y0, null);
    	}
     
    	public Insets getBorderInsets(Component c) {
    		return new Insets(0,0,0,0);
    	}
     
    	public boolean isBorderOpaque() {
    		return true;
    	}
     
    }
    Un petit détail que je n'arrive pas à résoudre est que je voudrais que l'image remplisse l'ensemble du JDesktopPane malgré sa taille (800*600) et, si possible, qu'elle se redimensionne en même temps que le JDesktopPane. Est-ce possible ?
    Merci de vos infos.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  2. #2
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    J'avais vu une méthode super simple, mais sinon tu peux passer par une AffineTranform :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
      AffineTransform t = AffineTransform.getScaleInstance(width / (double) image.getWidth(), height / (double) image.getHeight());
     
      ((Graphics2D)g).transform(t);
     
      g.drawImage(0, 0, width, height);
     
      ((Graphics2D)g).transform(t.createInverse());
    }
    A quelques paramètres près, ça devrait marcher.

    Sinon, le prends pas mal, mais utiliser une Border pour dessiner le fond d'un composant, c'est franchement pas propre. Ce que tu peux faire, c'est ajouter un composant de ta fabrication au layer le plus profond du JDesktopPane:
    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
    public class MonComposant extends JComponent {
     
       private final Image image;
     
       public MonComposant(Image image) {
          this.image = image;
       }
     
       public void paintComponent(Graphics g) {
        AffineTransform t = AffineTransform.getScaleInstance(width / (double) image.getWidth(), height / (double) image.getHeight());
        ((Graphics2D)g).transform(t);
        g.drawImage(0, 0, width, height);
        ((Graphics2D)g).transform(t.createInverse());
       } 
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    java.net.URL url = getClass().getResource("toto.png");
    java.awt.image.BufferedImage image = javax.imageio.ImageIO.read(url);
     
    MonComposant c = new MonComposant(image);
     
    jDesktopPane.setLayer(c, Integer.MIN_VALUE, -1);
    c.setBounds(0, 0, jDesktopPane.getWidth(), jDesktopPane.getHeight());
    jDesktopPane.add(c);
    Je n'ai pas testé, mais ça devrait marcher.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Ok Xavlours, c'est à essayer. Curieusement, la solution que j'ai proposé est extraite du réseau de développeurs officiels Java Mais c'est vrai que c'est une solution plutôt lente.
    Donc, le temps de corriger une autre portion de code et j'attaque le mien.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  4. #4
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Bonjour

    Xavlours, j'ai essayé d'implémenter ton code de la manière suivante :
    Voici ma classe découlant de JComponent:
    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
     
    import javax.swing.JComponent;
    import java.awt.Image;
    import java.awt.geom.AffineTransform;
    import java.awt.Graphics2D;
    import java.awt.Graphics;
     
    public class DesktopImage extends JComponent {
     
    	private final Image image;
     
    	public DesktopImage(Image image) {
    		this.image = image;
    	}
     
    	public void paintComponent(Graphics g) {
    		int width = JPCR.jDesktopPane.getWidth();
    		int height = JPCR.jDesktopPane.getHeight();
    		AffineTransform t = AffineTransform.getScaleInstance(width / (double) image.getWidth(this), height / (double) image.getHeight(this));
    		((Graphics2D)g).transform(t);
    		g.drawImage(image, width, height, this);
    		try{
    			((Graphics2D)g).transform(t.createInverse());
    		}catch(java.awt.geom.NoninvertibleTransformException nte){
    			nte.printStackTrace();
    		}
    	} 
     
    }
    Et la manière dont je l'appelle :
    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
     
    private JDesktopPane getJDesktopPane() {
    		if (jDesktopPane == null) {
    			jDesktopPane = new JDesktopPane();
    			try{
    				java.net.URL url = getClass().getResource("BioXpr.png");
    				java.awt.image.BufferedImage image = javax.imageio.ImageIO.read(url);
    				DesktopImage c = new DesktopImage(image); 
    				jDesktopPane.setLayer(c, Integer.MIN_VALUE, -1);
    				c.setBounds(0, 0, jDesktopPane.getWidth(), jDesktopPane.getHeight());
    				jDesktopPane.add(c);
    			}
    			catch(java.net.MalformedURLException murle){ murle.printStackTrace(); }
    			catch(java.io.IOException ioe){ ioe.printStackTrace(); }
    		}
    		return jDesktopPane;
    	}
    Aucune erreur à la compilation et aucune non plus lors de l'exécution. Seulement, mon image n'apparaît pas !
    Quelle pourrait en être la cause
    Merci d'avance de vos réponses.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  5. #5
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Citation Envoyé par GLDavid
    la solution que j'ai proposé est extraite du réseau de développeurs officiels Java
    bon, ben moi avec ma solution javadoc, j'ai plus qu'à me rhabiller.
    Citation Envoyé par GLDavid
    Mais c'est vrai que c'est une solution plutôt lente.
    Je sais pas si il y a plus rapide ...

    Si les developpeurs Java font comme ça, c'est qu'il y a une raison que j'ignore.

    Bon, après quelques tests, ça venait des coordonnées dans drawImage. J'ai finalement fait une classe comme ç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
    public class DesktopImage extends JComponent implements ComponentListener {
     
       private final Image image;
     
       public DesktopImage(Image image) {
          this.image = image;
       }
     
       public Dimension getPreferredSize() {
    	   return new Dimension(image.getWidth(this), image.getHeight(this));
       }
     
       public void paintComponent(Graphics g) {
          int width = getWidth();
          int height = getHeight();
          AffineTransform t = AffineTransform.getScaleInstance(width / (double) image.getWidth(this), height / (double) image.getHeight(this));
          ((Graphics2D)g).transform(t);
          g.drawImage(image, 0, 0, this);  // c'est là que ca plantait
          try{
             ((Graphics2D)g).transform(t.createInverse());
          }catch(java.awt.geom.NoninvertibleTransformException nte){
             nte.printStackTrace();
          }
       }
     
       public void componentResized(ComponentEvent e) {
    	   setSize(e.getComponent().getSize());
       }
     
       public void componentMoved(ComponentEvent e) {
    	   setSize(e.getComponent().getSize());
       }
     
       public void componentShown(ComponentEvent e) {
    	   setSize(e.getComponent().getSize());
       }
     
       public void componentHidden(ComponentEvent e) {
    	   setSize(e.getComponent().getSize());
       }
    }
    Et pour l'appliquer au desktop :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    desktop.add(myDesktopImage, Integer.MIN_VALUE);
    desktop.addComponentListener(myDesktopImage);
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  6. #6
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Bon, en fait, ça n'a pas l'air de marcher, quand j'ajoute des JInternalFrames, l'image ne s'affiche plus.
    Il faut rester dans la méthode utilisant les Border, mais le principe de l'AffineTransform marche toujours.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  7. #7
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Hello

    Tu as raison Xavlours, ça marche mieux avec les Border. Voici la classe qui fonctionne:
    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
     
    import javax.swing.border.Border;
     
    import java.awt.Graphics2D;
    import java.awt.Graphics;
    import java.awt.Component;
    import java.awt.RenderingHints;
    import java.awt.Insets;
    import java.awt.Image;
    import java.awt.geom.AffineTransform;
     
    public class CentredBackgroundBorder implements Border {
     
    	private final Image image;
     
    	public CentredBackgroundBorder(Image image) {
    		this.image = image;
    	}
     
    	public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
    		int x0 = 0;
    		int y0 = 0;
    		Graphics2D g2 = (Graphics2D)g;
    		AffineTransform t = AffineTransform.getScaleInstance(width / (double) image.getWidth(JPCR.jDesktopPane), height / (double) image.getHeight(JPCR.jDesktopPane)); 
    		g2.transform(t);
    		g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
    		g2.drawImage(image, x0, y0, null);
    		try{
    			((Graphics2D)g).transform(t.createInverse());
    		}catch(java.awt.geom.NoninvertibleTransformException nte){
    			nte.printStackTrace();
    		} 
    		g = (Graphics)g2;
    	}
     
    	public Insets getBorderInsets(Component c) {
    		return new Insets(0,0,0,0);
    	}
     
    	public boolean isBorderOpaque() {
    		return true;
    	}
     
    }
    Avec ça, ça fonctionne du tonnere !
    Merci Xavlours de ton aide

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  8. #8
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Euh, qui a mis le tag FAQ ???
    Merci d'avance.
    J'ai loupé quelque chose dans la FAQ ?

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  9. #9
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Suite à un post qui m'a été envoyé, voici 2 codes (un main et une autre classe) qui vous permettront d'avoir une image dans un JDesktopPane qui se rechargera en fonction de la taille de votre JDesktopPane :
    Code Main:
    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.awt.BorderLayout;
    import java.awt.Toolkit;
     
    import javax.swing.JMenuBar;
    import javax.swing.JMenu;
    import javax.swing.JMenuItem;
    import javax.swing.UIManager;
     
    import java.awt.event.*;
    import javax.swing.JDesktopPane;
     
    public class Main{
    	public static JFrame jFrame = null;
    	private JPanel jContentPane = null;
    	private JPanel jPanel = null;
    	public static JDesktopPane jDesktopPane = null;
     
    	/**
             * This method initializes jFrame       
             *      
             * @return javax.swing.JFrame   
             */
    	private JFrame getJFrame() {
    		if (jFrame == null) {
    			jFrame = new JFrame();
    			jFrame.setContentPane(getJContentPane());
    			java.awt.Dimension screend = Toolkit.getDefaultToolkit().getScreenSize(); 
    			jFrame.setSize((int)screend.getWidth(), (int)screend.getHeight());
    			jFrame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
    			jFrame.addWindowListener(new WindowListener(){
    				public void windowOpened(WindowEvent e){}
    				public void windowClosing(WindowEvent e){
    					Object[] options = {"Yes", "No", "Cancel"};
    					int n = javax.swing.JOptionPane.showOptionDialog(jFrame,
    							"Are you sure to quit ?",
    							"Quit",
    							javax.swing.JOptionPane.YES_NO_CANCEL_OPTION,
    							javax.swing.JOptionPane.QUESTION_MESSAGE,
    							null,
    							options,
    							options[0]);
    					if(n!=0){
    						jFrame.setDefaultCloseOperation(jFrame.DO_NOTHING_ON_CLOSE);
    					} 
    					else
    						System.exit(0);
    				}
    				public void windowClosed(WindowEvent e){}
    				public void windowIconified(WindowEvent e){}
    				public void windowDeiconified(WindowEvent e){}
    				public void windowActivated(WindowEvent e){}
    				public void windowDeactivated(WindowEvent e){}
    			});
    		}
    		return jFrame;
    	}
     
    	/**
             * This method initializes jContentPane 
             *      
             * @return javax.swing.JPanel   
             */
    	private JPanel getJContentPane() {
    		if (jContentPane == null) {
    			jContentPane = new JPanel();
    			jContentPane.setLayout(new BorderLayout());
    			jContentPane.add(getJPanel(), java.awt.BorderLayout.CENTER);
    		}
    		return jContentPane;
    	}
     
    	/**
             * This method initializes jPanel       
             *      
             * @return javax.swing.JPanel   
             */
    	private JPanel getJPanel() {
    		if (jPanel == null) {
    			jPanel = new JPanel(new BorderLayout());
    			jPanel.add(getJDesktopPane(), BorderLayout.CENTER);
    		}
    		return jPanel;
    	}
     
    	public Main() {
    		//Create an object who contains all the text of the differents components in all languages
    		JFrame mainFrame = getJFrame();
    		mainFrame.setVisible(true);
    	}
    	private void Exit(ActionEvent evt){
    		Object[] options = {"Yes", "No", "Cancel"};
    		int n = javax.swing.JOptionPane.showOptionDialog(Main.jFrame,
    				"Are you sure to quit ?",
    				"Quit 2",
    				javax.swing.JOptionPane.YES_NO_CANCEL_OPTION,
    				javax.swing.JOptionPane.QUESTION_MESSAGE,
    				null,
    				options,
    				options[0]);
    		if(n==0)
    			System.exit(0);
    	}
     
    	/**
             * This method initializes jDesktopPane 
             *      
             * @return javax.swing.JDesktopPane     
             */
    	private JDesktopPane getJDesktopPane() {
    		if (jDesktopPane == null) {
    	         jDesktopPane = new JDesktopPane();
    	         try{
    	            java.net.URL url = getClass().getResource("debian.png");
    	            java.awt.image.BufferedImage image = javax.imageio.ImageIO.read(url);
    	            jDesktopPane.setBorder(new CentredBackgroundBorder(image));
    	         }
    	         catch(java.net.MalformedURLException murle){ murle.printStackTrace(); }
    	         catch(java.io.IOException ioe){ ioe.printStackTrace(); }
    	      }
    	      return jDesktopPane; 
    	}
     
    	public static void main(String[] args) {
    		try {
    			UIManager.setLookAndFeel("com.sun.java.swing.plaf.metal.MetalLookAndFeel");
    		} catch (Exception e) { }
    		new Main();
    	}
     
    }
    Code CentredBackgroundBorder:
    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
     
    import javax.swing.border.Border;
     
    import java.awt.Graphics2D;
    import java.awt.Graphics;
    import java.awt.Component;
    import java.awt.RenderingHints;
    import java.awt.Insets;
    import java.awt.Image;
    import java.awt.geom.AffineTransform;
     
    public class CentredBackgroundBorder implements Border {
     
    	private final Image image;
     
    	public CentredBackgroundBorder(Image image) {
    		this.image = image;
    	}
     
    	public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
    		int x0 = 0;
    		int y0 = 0;
    		Graphics2D g2 = (Graphics2D)g;
    		AffineTransform t = AffineTransform.getScaleInstance(width / (double) image.getWidth(Main.jDesktopPane), height / (double) image.getHeight(Main.jDesktopPane)); 
    		g2.transform(t);
    		g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
    		g2.drawImage(image, x0, y0, null);
    		try{
    			((Graphics2D)g).transform(t.createInverse());
    		}catch(java.awt.geom.NoninvertibleTransformException nte){
    			nte.printStackTrace();
    		} 
    		g = (Graphics)g2;
    	}
     
    	public Insets getBorderInsets(Component c) {
    		return new Insets(0,0,0,0);
    	}
     
    	public boolean isBorderOpaque() {
    		return true;
    	}
     
    }
    Si ça peut aider quelqu'un, j'en serais ravi.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  10. #10
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Un tout grand merci GLDavid !!

    Ca marche très très bien, et ton exemple est très compréhensif !!

    Ce bout de code mériterait de se retrouver dans la FAQ !

    Bonne journée !

  11. #11
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Merci calogerogigante.
    J'ai écris la même chose dans le thread concerné pour les sources Java.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  12. #12
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Je suis en train d'essayer deux variantes de ton bout de code :

    1) paver tout le fond du JDesktopPane avec la même image ( "en mosaique").

    2) centrer une image (taille 100% originale) en permance (même si la fenêtre est redimensionnée) au milieu du panel du JDesktopPane. (EX: utile pour mettre le beau logo de son programme).

    Si j'ai des problèmes, j'appelle à l'aide...
    Si j'y arrive tout seul, je poste la modification...

    J'essaie de simplifier au plus...

  13. #13
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Bon, je suis en train de faire la version avec l'image restant au centre :

    ceci marche bien en remplacemant de la classe CentredBackgroundBorder :

    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
    import javax.swing.border.*;
    import java.awt.*;
    import java.awt.geom.*;
     
    public class CentredBackgroundBorder implements Border
    {
       private final Image image;
     
       public CentredBackgroundBorder(Image image)
       {
          this.image = image;
       }
     
       public void paintBorder(Component c, Graphics g, int x, int y, int width, int height)
       {
          int JDP_larg = (width/2) -(image.getWidth( Main.jDesktopPane)/2);
          int JDP_long = (height/2)-(image.getHeight(Main.jDesktopPane)/2);
     
          g.drawImage(image, JDP_larg , JDP_long, null);
       }
     
       public Insets getBorderInsets(Component c)
       {
          return new Insets(0,0,0,0);
       }
     
       public boolean isBorderOpaque()
       {
          return true;
       }
    }
    Le problème : c'est quand on diminue le JDesktopPane a une dimension plus petite que l'image. Dès ce moment, l'image se réduit aussi en épousant la taille du JDesktopPane proportionnellement...

    Est-ce normal ? (J'aurais voulu éviter ce redimensionnement tout petit et garder toujours le centrage en 100% de taille originale de mon image)

  14. #14
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Oui c'est normal : quand tu appelles g.drawImage(image, x, y, w, h, null);, un zoom est appliqué pour faire coïncider l'image avec le rectangle.

    Avec g.drawImage(image, x, y, null), les paramètres width et height sont calculés pour que l'image rentre dans le composant. Tu peux forcer ces paramètres à une valeur supérieure, et dans ce cas, l'image ne rentrera pas entièrement et ne sera pas peinte entièrement.


    [EDIT] En fait je viens juste de comprendre ça, et en relisant ce post, je me rends compte que pour GLDavid, il suffisait depuis le début d'appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.drawImage(x, y, width, height);
    Ca s'appelle galérer pour rien. Je suis trop blasé !
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  15. #15
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Mais comment alors forcer l'image a garder toujours sa taille 100% et toujours son centrage par rapport au JDesktopPane, même si celui est diminué à une taille inférieure à l'image ?

    (C'est dans le cas où ça ne me plairait pas de voir l'image se réduire proportionnellement au JDesktopPane...)

  16. #16
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Voilà, avec ceci, l'image n'est pas réduite proportionnellement au JDesktopPane, mais reste à 100% de taille originale, quand le JDesktopPane est réduit à une taille plus petite que l'image :

    (C'est + ou - ce que je recherche, tant pis pour le centrage non-stop qui n'est pas respecté dans ce cas, car l'image reste alors dans son coin supérieur gauche) :

    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
    import javax.swing.border.*;
    import java.awt.*;
     
    public class CentredBackgroundBorder implements Border
    {
       private final Image image;
     
       public CentredBackgroundBorder(Image image)
       {
          this.image = image;
       }
     
       public void paintBorder(Component c, Graphics g, int x, int y, int width, int height)
       {
          // largeur de l'image
          int image_larg = image.getWidth( Main.jDesktopPane) ;
          // longueur de l'image
          int image_long = image.getHeight(Main.jDesktopPane) ;
     
          // width est aussi la largeur du JDesktopPane
          int x_pos = (width/2) - image_larg/2;
          // height est aussi la longueur du JDesktopPane
          int y_pos = (height/2)- image_long/2;
     
          if (x_pos<0) x_pos = 0;
          if (y_pos<0) y_pos = 0;
     
          g.drawImage(image, x_pos , y_pos, null);
       }
     
       public Insets getBorderInsets(Component c)
       {
          return new Insets(0,0,0,0);
       }
     
       public boolean isBorderOpaque()
       {
          return true;
       }
    }
    Merci pour l'aide.

    J'essaie de voir maintenant comment adapter tout ça pour faire une mosaïque d'une image en fond de JDesktopPane...
    ;-)
    (Si quelqu'un a déjà une idée...)

  17. #17
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Voilà, pour clôre ce post lancé par GLDavid, la version de la classe qui pave tout le fond du JDesktopPane avec une même image affichée chaque fois à 100 % (mosaïque) :

    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
    import javax.swing.border.*;
    import java.awt.*;
     
    public class CentredBackgroundBorder implements Border
    {
       private final Image image;
     
       public CentredBackgroundBorder(Image image)
       {
          this.image = image;
       }
     
       public void paintBorder(Component c, Graphics g, int x, int y, int width, int height)
       {
          // largeur de l'image
          int image_larg = image.getWidth( Main.jDesktopPane) ;
          // longueur de l'image
          int image_long = image.getHeight(Main.jDesktopPane) ;
     
          // width est aussi la largeur du JDesktopPane
          // height est aussi la longueur du JDesktopPane
     
          // Combien de fois l'image rentre-t-elle en largeur
          int x_fois = (width / image_larg) + 1 ;
          // Combien de fois l'image rentre-t-elle en longueur
          int y_fois = (height / image_long) + 1 ;
     
          for (int i = 0; i<x_fois; i++)
            {
            for (int j = 0; j<y_fois; j++)
               {
               g.drawImage(image, i*image_larg , j*image_long, null);
               }
            }
          System.out.println("larg "+x_fois+" - long "+y_fois);
       }
     
       public Insets getBorderInsets(Component c)
       {
          return new Insets(0,0,0,0);
       }
     
       public boolean isBorderOpaque()
       {
          return true;
       }
    }
    Faudrait idéalement juste renommer la classe ici en MosaicBackgroundBorder, pour rester logique.
    ;-)

    Merci à tous pour avoir initialisé ce fil qui a répondu à plusieurs questions que je me posais concernant le décor du fond des composants JDesktopPane.

    Je l'adore, ce forum !!
    ;-)

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Points : 99
    Points
    99
    Par défaut
    Merci ca me sert bien cà !
    Super code , bravo à vous

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

Discussions similaires

  1. redimensionnement d'une image, mais pas placée correctement
    Par maxfive7 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 19/08/2007, 23h39
  2. ASP : redimensionner/compresser une image
    Par laptiote dans le forum ASP
    Réponses: 6
    Dernier message: 23/07/2007, 17h46
  3. Redimensionnement d'une image en même temps que sa JFrame
    Par mandou1 dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 22/06/2007, 11h04
  4. Réponses: 2
    Dernier message: 27/11/2006, 14h16
  5. probleme redimensionnement d'une image
    Par meteor4 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/11/2004, 13h58

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