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 :

Explication sur getWidth et getHeight avec un objet Image


Sujet :

AWT/Swing Java

  1. #1
    HNT
    HNT est déconnecté
    Membre éclairé Avatar de HNT
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    448
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 448
    Par défaut Explication sur getWidth et getHeight avec un objet Image
    Bonjour,

    Pour m'amuser et pour experimenté les FileFilter, j'ai écrit un petit programme qui affiche une image choisie via un JFileChooser. Je déssine l'image sur un JPanel (ça marche bien) mais je ne sais pas comment récupérer la taille de l'image. En effet, si elle est trop grande (plus grande que l'écran) je met le JPanel dans un JScrollPane. Cependant, la façon dont je récupère la taille des images est visiblement foireuse. Voici une partie du code :
    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
     
    public class ImageViewer extends JFrame
    {
    	private String currentImg;
    	private static final int MIN_SIDE = 150;
        private static final long serialVersionUID = 1L;
        private static final String TITRE = "Simple image viewer";
        private static final int MAX_WIDTH = Toolkit.getDefaultToolkit().getScreenSize().width;
    	private static final int MAX_HEIGH = Toolkit.getDefaultToolkit().getScreenSize().height;
     
    	public static void main (String[]args)
    	{
    		new ImageViewer();
    	}
     
    	public ImageViewer()
    	{
    		super(TITRE);
    		this.currentImg = "";
    		this.addComponents();
    		this.definirPropriete();
    	}
    ...
    private void showImage()
    	{
    		if (this.currentImg == null)
    			return;
    		this.getContentPane().removeAll();
    		MonPanel paneau = new MonPanel();
    		this.setSize(paneau.getNeededSize());
    		System.out.println(paneau.needHorizontalScrolling() || paneau.needVerticalScrolling());
    		if (paneau.needHorizontalScrolling() || paneau.needVerticalScrolling())
    			this.add(this.getScrollPane(paneau));
    		else
    			this.add(paneau);
    		this.setVisible(true);
    	}
     
    	private JScrollPane getScrollPane(MonPanel paneau)
    	{
    		JScrollPane pane = new JScrollPane(paneau);
    		JScrollBar bare = new JScrollBar();
    		bare.setUnitIncrement(35);
    		if (paneau.needVerticalScrolling())
    			pane.setVerticalScrollBar(bare);
    		if (paneau.needHorizontalScrolling())
    			pane.setHorizontalScrollBar(bare);
    		return pane;
    	}
     
    	private void definirPropriete()
        {
    	    this.setSize(300,400);
    	    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	    this.setLocationRelativeTo(this);
    	    this.setVisible(true);
        }
     
    	private class MonPanel extends JPanel
    	{
    		private Image toDraw;
    	    private static final long serialVersionUID = 1L;
     
    	    public MonPanel()
    	    {
    	    	this.toDraw = Toolkit.getDefaultToolkit().getImage(currentImg);
    	    }
     
    	    private Dimension getNeededSize()
    	    {
    	    	int width = this.toDraw.getWidth(this);
    	    	int height = this.toDraw.getHeight(this);
    	    	return new Dimension(width < MIN_SIDE ? MIN_SIDE : width, height < MIN_SIDE ? MIN_SIDE : height);
    	    }
     
    	    private boolean needVerticalScrolling()
    	    {	
    	    	return toDraw.getHeight(ImageViewer.this) > MAX_HEIGH;
    	    }
     
    	    private boolean needHorizontalScrolling()
    	    {	
    	    	return toDraw.getWidth(ImageViewer.this) > MAX_WIDTH;
    	    }
     
    	    protected void paintComponent(Graphics g)
    	    {
    	    	super.paintComponent(g);	
    	    	int x = (this.getWidth() - toDraw.getWidth(this))/ 2;
    	    	int y = (this.getHeight() - toDraw.getHeight(this))/ 2;
    	     	g.drawImage(toDraw, x, y, this);
    	    }
    	}
    }
    Voila, les méthodes donnant la taille de l'image sont dans MonPanel. Elles ne fonctionne visiblement pas correctement.

  2. #2
    HNT
    HNT est déconnecté
    Membre éclairé Avatar de HNT
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    448
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 448
    Par défaut
    Et en plus il semblerai que j'emploie mal le JScrollPane car même si je met un retrun true à laplace des deux méthodes (celles de MonPanel qui vérifié si la taille de l'image est supérieure à celle de la fenêtre), et bien, je ne l'ai pas mon JScrollPane.

  3. #3
    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
    Dans ton cas il suffit juste de faire la chose suivante:

    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
    private class MonPanel extends JPanel {
       private BufferedImage toDraw;  //BufferedImage car plus pratique
       private static final long serialVersionUID = 1L;
            
       public MonPanel() {
       this.toDraw = ImageIO.read(new File(currentImg));    //la lecture d'image par ImageIO est plus sure: elle charge tout l'image d'un coup alors que le toolkit ne le fait pas
           this.setPreferredSize(toDraw.getWidth(), toDraw.getHeight());    //pour que le JScrollPane Réagisse correctement, si tu as une méthode set sur ton image penses également à faire cet appel
       }
            
            
       protected void paintComponent(Graphics g) {
       super.paintComponent(g); 
       int x = ( this.getWidth() - toDraw.getWidth())/ 2;
       int y = ( this.getHeight() - toDraw.getHeight())/ 2;
           g.drawImage(toDraw, x, y, this);
        }
    }
    et de le mettre dans un JScrollPane, celui ci s'adaptant automatiquement à la taille de l'image

  4. #4
    HNT
    HNT est déconnecté
    Membre éclairé Avatar de HNT
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    448
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 448
    Par défaut
    Merci beaucoup, cela marche impecablement.

  5. #5
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 15
    Par défaut
    Question, par rapport à la réponse et à ma culture générale:
    n'aurait-on pas pu utilisé la fonction "imageUpdate" lié a l'ImageObserver?
    (désolé si ma question est totalement hors contexte, ou complètement stupide....)

  6. #6
    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
    Si mais bon, pourquoi s'emmerder à faire ça quand tu peux el faire en une seule ligne...

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

Discussions similaires

  1. Explication sur l'objet HttpApplication
    Par jbrasselet dans le forum C#
    Réponses: 0
    Dernier message: 07/07/2011, 17h18
  2. Réponses: 4
    Dernier message: 28/03/2011, 14h39
  3. Requète sur BDD avec l'objet PDO
    Par zenico64 dans le forum Langage
    Réponses: 21
    Dernier message: 09/11/2010, 11h47
  4. Réponses: 2
    Dernier message: 19/04/2010, 15h20
  5. Réponses: 11
    Dernier message: 05/10/2009, 15h49

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