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 :

Redimensionner un label


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut Redimensionner un label
    Bonjour,

    Voici mon programme :
    Je charge une image dans un Jlabel et je redimmensionne mon image en fonction de mon jlabel.
    Mon Jlabel a le paramètre resizable à "true"

    Ce qui fait que quand j'ai bien recalculé la taille de mon Jlabel et que je l'applique à mon image, l'image s'affiche à la bonne taille mais le jlabel augmente.
    Si je désactive le parametre resizable ça marche.
    Mais je veux garder ce paramètre.

    Mon idée est après avoir placer mon image, je veux trouver les dimensions de ma nouvelle Image pour les imposer à mon label.

    label.getWidth() ne fonctionne pas car mon image est une ImageIcon.

    Avez- vous une idée ?

    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
     
    public static BufferedImage imgglobal = null;
        public static BufferedImage imgOriginal = null;
        public static Image imagelabel = null;
        public static ImageIcon imageagrandie = null;
        //*****************************************
     
     
        //*********Methods*************************
        public  void Import_Image(){
     
            JFileChooser chooser = new JFileChooser();//création dun nouveau filechosser
    	chooser.setApproveButtonText("Choose this file..."); //intitulé du bouton
    	chooser.showOpenDialog(null); //affiche la boite de dialogue
     
            try{
            //file_path = chooser.getSelectedFile().getAbsolutePath();
            imgglobal = ImageIO.read(new File(chooser.getSelectedFile().getAbsolutePath()));
            imgOriginal = ImageIO.read(new File(chooser.getSelectedFile().getAbsolutePath()));
            Scale_Image();
            } catch (IOException e) {
            }
     
        }
        public void Scale_Image(){ 
            int x1 = labelimg.getWidth();
            int y1 = labelimg.getHeight();
     
     
            imagelabel = imgglobal;
            imagelabel = imagelabel.getScaledInstance(x1,y1,Image.SCALE_DEFAULT);
            imageagrandie = new ImageIcon(imagelabel);
            labelimg.setIcon(imageagrandie);
        }

    J'ai cet aspect :

    Nom : resizable.JPG
Affichages : 1258
Taille : 148,0 Ko
    Mon image fait excatement la taille du JLabel avant. Mais le bord a droite se rajoute car j'ai défini l'application en plein écran et resizable.

    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,

    Je ne vois ce que tu veux dire par "Mon Jlabel a le paramètre resizable à "true"". Quel paramètre resizable ? Une JFrame a un tel paramètre, mais pas un JLabel Swing.

    Ensuite, un JLabel se redimensionne par rapport à son contenu mais également par rapport au layout manager dans lequel il se trouve (sauf si on fonctionne sans layout manager, ce qui est toujours une mauvaise idée). Ensuite, on peut contrôler dans une certaine mesure la façon dont les dimensions d'un JLabel sont déterminées selon le contexte, en jouant avec sa taille préférentielle, maximum et minimum. Ces paramètres seront pris en compte différemment selon le layout manager du container. Un label doit pouvoir toujours s'étendre d'une manière ou d'une autre de toute façon, une fenêtre pouvant toujours le faire, du moins dans les limites de l'écran. Pense également que ton image peut être placée à l'intérieur du JLabel de différente manière (centrée, cadrée à gauche, à droite, etc...).

    Par ailleurs, calculer la taille de l'image pour la remettre à la taille d'un JLabel ne peut fonctionner que si le JLabel ne peut jamais changer de taille (donc ça dépend du contexte). Sinon tu introduis une notion de boucle, ou alors l'image n'a de toute manière pas la taille du JLabel à un moment donné. Il faut éventuellement envisager de faire un composant d'affichage d'image qui adapte la taille de l'image, plutôt que de chercher à adapter l'image à la taille d'un JLabel, 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
    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
    public class ImagePanelDemo {  
     
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		ImagePanel imagePanel = new ImagePanel();
    		imagePanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
     
    		frame.add( imagePanel );
     
    		JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
    		JButton buttonLoad = new JButton("Charger image");
    		buttonPanel.add(buttonLoad);
     
    		frame.add(buttonPanel, BorderLayout.SOUTH);
     
    		frame.add(imagePanel);
     
    		buttonLoad.addActionListener(e-> loadImage(frame, imagePanel));
     
    		frame.setSize(600, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	private static void loadImage(Component parent,  ImagePanel imagePanel) {
    		JFileChooser chooser = new JFileChooser();
    		chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
    		chooser.setMultiSelectionEnabled(false);
    		chooser.setDialogTitle("Choisir une image");
    		if ( chooser.showOpenDialog(parent)==JFileChooser.APPROVE_OPTION ) {
    			File file = chooser.getSelectedFile();
    			try {
    				final BufferedImage image = ImageIO.read(file);
    				if ( image!=null ) {
    					imagePanel.setImage(image); 
    				}
    				else {
    					JOptionPane.showMessageDialog(parent, "Fichier incorrect", "Erreur", JOptionPane.ERROR_MESSAGE);
    				}
    			} catch (IOException e) {
    				e.printStackTrace();
    				JOptionPane.showMessageDialog(parent, "Fichier incorrect ou corrompu", "Erreur", JOptionPane.ERROR_MESSAGE);
    			}
    		}
     
    	}
     
    	private static class ImagePanel extends JPanel {
     
    		private BufferedImage image;
     
    		public void setImage(BufferedImage image) {
    			this.image=image;
    			repaint();
    		}
     
    		@Override
    		protected void paintComponent(Graphics g) {
    			super.paintComponent(g);
    			if ( image!=null ) {
    				final double width;
    				final double height;
    				if ( image.getWidth()>image.getHeight() ) {
    					final double scale = (getWidth()*1f)/image.getWidth();
    					width = getWidth();
    					height = image.getHeight()*scale;
    				}
    				else {
    					final double scale = (getHeight()*1f)/image.getHeight();
    					height = getHeight();
    					width = image.getWidth()*scale;
    				}
    				final double x = (getWidth()-width)/2;
    				final double y = (getHeight()-height)/2;
    				g.drawImage(image, (int)x, (int)y, (int)width, (int)height, this);
    			}
    		}
     
    	}
     
    }
    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 du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Bonjour,

    Alors tout d'abord merci beaucoup.
    Oui je comprends ça marche très bien quand mon JLabel à une taille fixe.
    Mais je n'ai pas bien compris je dois abandonner mon JLabel ducoup ou ce code peut s'y appliquer ?

    Alors j'ai essayer d'appliquer le code mais je ne comprends pas bien comment l'associer au mien, car c'est une autre classe. Comment dois-je l'appeler pour qu'il intervienne dans mon JLabel ?
    Voila comment je l'ai placé.

    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
     
    public class Window extends javax.swing.JFrame {
     
     
        public Window() {
            initComponents();
        }
     
        //*********Variables***********************
        public static BufferedImage imgglobal = null;
        public static BufferedImage imgOriginal = null;
        public static Image imagelabel = null;
        public static ImageIcon imageagrandie = null;
        //*****************************************
     
     
        //*********Methods*************************
        public  void Import_Image(){
     
            JFileChooser chooser = new JFileChooser();//création dun nouveau filechosser
    	chooser.setApproveButtonText("Choose this file..."); //intitulé du bouton
    	chooser.showOpenDialog(null); //affiche la boite de dialogue
     
            try{
            //file_path = chooser.getSelectedFile().getAbsolutePath();
            imgglobal = ImageIO.read(new File(chooser.getSelectedFile().getAbsolutePath()));
            imgOriginal = ImageIO.read(new File(chooser.getSelectedFile().getAbsolutePath()));
            //Scale_Image();
            } catch (IOException e) {
            }
     
        }
        public void Scale_Image(){ 
            int x1 = labelimg.getWidth();
            int y1 = labelimg.getHeight();
     
     
     
            imagelabel = imgglobal;
            imagelabel = imagelabel.getScaledInstance(x1,y1,Image.SCALE_DEFAULT);
            imageagrandie = new ImageIcon(imagelabel);
            labelimg.setIcon(imageagrandie);
     
     
            //labelimg.setSize((new Dimension(x1,y1)));
     
        }
        //*****************************************
     
        private  class ImagePanel extends JPanel {
     
    		private BufferedImage image;
     
    		public void setImage(BufferedImage image) {
    			this.image=image;
    			repaint();
    		}
     
    		@Override
    		protected void paintComponent(Graphics g) {
    			super.paintComponent(g);
    			if ( image!=null ) {
    				final double width;
    				final double height;
    				if ( image.getWidth()>image.getHeight() ) {
    					final double scale = (getWidth()*1f)/image.getWidth();
    					width = getWidth();
    					height = image.getHeight()*scale;
    				}
    				else {
    					final double scale = (getHeight()*1f)/image.getHeight();
    					height = getHeight();
    					width = image.getWidth()*scale;
    				}
    				final double x = (getWidth()-width)/2;
    				final double y = (getHeight()-height)/2;
    				g.drawImage(image, (int)x, (int)y, (int)width, (int)height, this);
    			}
    		}
     
    	}
     
        private void Add_Image(java.awt.event.ActionEvent evt) {                           
            Import_Image();
        }                          
     
     
     
     
        // Variables declaration - do not modify                     
        private javax.swing.JMenu Add_Image;
        private javax.swing.JLabel jLabel2;
        private javax.swing.JMenuBar jMenuBar1;
        private javax.swing.JMenuItem jMenuItem1;
        private javax.swing.JMenuItem jMenuItem2;
        private javax.swing.JPanel jPanel1;
        private javax.swing.JLabel labelimg;
        // End of variables declaration                   
    }
    Merci beaucoup

    EDIT : J'utilise le GUI Designer de Netbeans pour faire mes fenêtres et labels panels etc.. c'est pour ça que je n'ai pas affiché le code qui est généré automatiquement.

  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
    Il remplace le JLabel. Et plus besoin de redimensionner ton image : le composant se charge de l'afficher toujours à la taille maximale, centrée. Attention, ça n'empêchera pas d'avoir des bandes grises : forcément, si tu affiches une image de 300*200 dans une fenêtre de 600*300, il y aura forcément des bandes grises. Parce que par défaut le content pane d'une JFrame a un BorderLayout.

    Si tu veux que le composant est une taille déterminée, applique-lui une taille préférentielle (setPreferredSize(new Dimension(image.getWidth()/2,image.getHeight()/2) par exemple) et mets le dans un composant intermédiaire, par exemple avec un FlowLayout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ImagePanel imagePanel = new ImagePanel();
    imagePanel.setBorder(BorderFactory.createLineBorder(Color.RED)); // dessine une ligne rouge autour de ligne
    imagePanel.setPreferredSize(new Dimension(300,200)); 
     
    JPanel constraintPanel = new JPanel(new FlowLayout()); // composant intermédiaire pour contraindre
    constraintPanel.add( imagePanel );
     
    frame.add( constraintPanel ); // ajout au content pane, au centre de son BorderLayout de défaut
    Avec un GridBagLayout (ou un GroupLayout, ou un SpringLayout...), tu pourras mettre des composants à côté, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ImagePanel imagePanel = new ImagePanel();
    imagePanel.setBorder(BorderFactory.createLineBorder(Color.RED));
    imagePanel.setPreferredSize(new Dimension(300,200)); 
     
    JPanel constraintPanel = new JPanel(new GridBagLayout());
    Insets insets = new Insets(3,3,3,3);
    constraintPanel.add( imagePanel, new GridBagConstraints(0, 0, 1, 5, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, insets, 0, 0) );
    constraintPanel.add( new JLabel("Champ 1 : "), new GridBagConstraints(1, 0, 1, 1, 0, 0, GridBagConstraints.EAST, GridBagConstraints.NONE, insets, 0, 0) );
    constraintPanel.add( new JTextField(), new GridBagConstraints(2, 0, 1, 1, 1, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, insets, 0, 0) );
    constraintPanel.add( new JLabel("Champ 2 : "), new GridBagConstraints(1, 1, 1, 1, 0, 0, GridBagConstraints.EAST, GridBagConstraints.NONE, insets, 0, 0) );
    constraintPanel.add( new JTextField(), new GridBagConstraints(2, 1, 1, 1, 1, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, insets, 0, 0) );
     
    frame.add( constraintPanel );
    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 du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Merci,

    Alors en fait quand l'utilisateur ouvre l'application elle se met en plein écran. Elle prend donc la taille de son écran.
    Je voudrais donc lorsque l'utilisateur charge une image que l'endroit où il la charge se redimensionne en fonction de la taille de la fenêtre.

    Exemple :

    Nom : Panel1.JPG
Affichages : 1174
Taille : 34,1 Ko
    Nom : Jpanel2.JPG
Affichages : 1177
Taille : 51,1 Ko

    Pour l'instant tous mes composants se redimensionne bien.
    J'ai donc supprimé mon label et je l'ai remplacé par un JPanel. (la carré bleu)

    Ducoup je ne comprend pas bien : Est ce possible avec le FlowLayout sur ce JPanel ?
    Je travaille avec GUI designer de NetBeans je n'ai pas trouvé les propriétés Layout je ne peux pas directement les modifier dans le code :/

    Merci beaucoup

  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 : 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
    Je ne comprends pas ce que tu veux dire par "Est ce possible avec le FlowLayout sur ce JPanel ?". Chaque LayoutManager dispose ses composants d'une certaine manière, et en utiliser un ou un autre dépend de la façon que tu veux disposer tes composants.

    Tu peux modifier le code de la Palette NetBeans (Par le menu Customize Code). Et il doit bien y avoir un moyen de paramétrer le layout manager quelque part.
    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
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Ah oui c'est bon j'ai trouvé comment définir un flowlayout

    Alors si j'ai bien compris

    J'ai ma JFrame dans laquelle se trouve un JPannel1 avec le flowLayout. Et dans ce JPanel1 je met un deuxieme JPanel2 dans lequel je peux mettre mon image ?

    EDIT : Par manque de temps j'ai finalement décidé de prendre un label fixe. Merci pour votre aide

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

Discussions similaires

  1. Label qui auto-redimensionne le texte
    Par ZouBi dans le forum Qt
    Réponses: 1
    Dernier message: 24/09/2010, 23h35
  2. Bug IE6 avec label : petites div redimensionnées
    Par pacpacapero dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 15/12/2007, 11h46
  3. [2005] Redimensionner un label
    Par monphp dans le forum Visual Studio
    Réponses: 2
    Dernier message: 06/01/2007, 14h29
  4. [VS2005][C#] Centrer un label dans un panel redimensionnable
    Par Bapt.ice dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/08/2006, 17h29
  5. [VB.NET] [#Develop] Label redimensionnable
    Par Emcy dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/01/2005, 13h55

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