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 :

Charger une image dans JScrollPane


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 74
    Par défaut Charger une image dans JScrollPane
    Nom : aRdTz.png
Affichages : 972
Taille : 9,7 Ko

    le programme est edité avec netBeans
    j'arrive pas a charger une image dans jscrollpane1
    voici le code :

    1 class:
    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
     
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import javax.imageio.ImageIO;
    import java.io.*;
     
    public class Draw_Image extends Canvas{
     
    	BufferedImage image= null;
    	//Constructeur, prend une image Buffered
    	public Draw_Image(BufferedImage img){
    		//copier l'image dans son attribut
    		image= img;
        }
    	public void paint(Graphics g){
    			//Peintre le graphique g d e l'image
    			g.drawImage(image,0,0,this);
     
    		}
     
    }
    2class : class pour charger une image dans Jcrollpane1(declarer dans main class)

    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 class LoadImage extends JPanel{
        private String path1;
        private String path2;
        private String path3;
        Main j;
     
        private JFileChooser parcourir= new JFileChooser();
     
        BufferedImage img = null;
     
        public LoadImage(){
        parcourir.showOpenDialog(null);
            if(parcourir.showOpenDialog(null)== JFileChooser.APPROVE_OPTION){
    	//récupérer image à partir du choix de l'utilisateur
    	String file2= parcourir.getSelectedFile().getPath();
    	path2= file2;
     
                try {
     
    		 img = ImageIO.read(new File(file2));
    		  Draw_Image d1= new Draw_Image(img);			
    		 // d1.setSize(j.jScrollPane1.getWidth(),j.jScrollPane1.getHeight());//donner une taille à d; selon le panel englobant
     
    		 jScrollPane1.removeAll();
    		 jScrollPane1.add(d1);	
                      add(d1, BorderLayout.CENTER);
    			        }
                 catch (IOException ex) {
                   // Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                     System.out.println("err");
                }}
    }
    }
    3 Main class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     private void jButton_Open_ImageActionPerformed(java.awt.event.ActionEvent evt) {                                                   
            new LoadImage();
        }     
     
    ...........
    //declaration
     private javax.swing.JButton jButton2;
        private javax.swing.JButton jButton_Open_Image;
        private javax.swing.JMenu jMenu1;
        private javax.swing.JMenu jMenu2;
        private javax.swing.JMenuBar jMenuBar1;
        protected javax.swing.JScrollPane jScrollPane1;
    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 : 55
    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,

    1. on n'utilise pas JScrollPane.add(Component) pour mettre un composant dans un JScrollPane, mais JScrollPane..setViewportView(Component)
    2. Ensuite, comme tu dessines directement l'image dans le contexte d'un Canvas, il va falloir que tu gères la taille du canvas, sinon le JScrollPane ne saura pas comment gérer le scrolling. Par exemple :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      public Draw_Image(BufferedImage img){
      		//copier l'image dans son attribut
      		image= img;
                      setPreferredSize(new Dimension(img.getWidth(), img.getHeight())); // dit que l'espace à gérer fait la taille de l'image
          }
      Tu peux faire ça beaucoup plus simplement en chargeant l'image dans un ImageIcon, que tu mets dans un JLabel (à la place du Canvas) : la taille est gérée automatiquement et pas besoin de rédéfinir paint.
    3. la variable jScrollPane1 ne peut être accèdée directement dans la classe LoadImage, puisque c'est un attribut d'une autre classe. En plus, tu mets le jscrollpane dans le JPanel "LoadImage", qui lui, n'est mis dans aucun conteneur, donc ne sera jamais affiché. Au lieu de faire ta méthode de chargement de l'image dans une autre classe, mets-la dans ta classe "main", ou alors il faudra lui passer la référence du JScrollPane se trouvant dans ta fenêtre principale.
    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 confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 74
    Par défaut
    je vous remerci *** Joel D'igo ***

    -1- c'est vrai en metteant le code dans la classe main (sauf bien sûr la classe Draw Image) le pg fonctionne juste cette fois-ci je l'ai copié telle qu'il est ==> j'ai laissé .jscrollpane1 add(d1); mais en changeant ça avec JScrollPane1. SetViewportView(d1) dans jscrollpane1 rien ce passe (aucune image afficher)

    2- j'ai voulu séparer les classes d'une part pour disant rendre le code propre et d'autre part parcque j'ai voulu ajouter d'autre classe pour afficher l h histogramme gris d'image zoom image c'est pour ces raisons je veux décortiquer mon code et le mot que m'avait mentionner c'est **** alors il faudra lui passer la référence du JScrollPane se trouvant dans ta fenêtre principale**** c'est la clé que je cherche (comment le faire -referencer JScrollPane-)

    -3 je vais voir pour ImageIcon qui paraît intéressent .
    En tout les cas un grand 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 : 55
    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 younes2727 Voir le message
    -1- c'est vrai en metteant le code dans la classe main (sauf bien sûr la classe Draw Image) le pg fonctionne juste cette fois-ci je l'ai copié telle qu'il est ==> j'ai laissé .jscrollpane1 add(d1); mais en changeant ça avec JScrollPane1. SetViewportView(d1) dans jscrollpane1 rien ce passe (aucune image afficher)
    Si je te dis d'utiliser setViewportView au lieu de add, c'est parce qu'il faut utiliser setViewportView, et pas add, point. Par "Il ne se passe rien" tu veux dire que l'image n'est toujours pas affichée ? C'est parce que tu n'as probablement pas appliqué complètement ce que je t'ai dit, à savoir donner une taille préférentielle à ton Canvas. Il faut virer les appes de add aussi, et l'appel de removeAll bien sûr (ça supprime les composants du JScrollPane, les ascenseurs, tout ça... aucun intérêt d'utiliser un JScrollPane si c'est pour supprimer ses composants).
    Par ailleurs, ce serait plus judicieux d'utiliser un JPanel plutôt qu'un Canvas : Canvas est une classe awt, pas Swing. En général, ça fonctionne, mais tu peux avoir des problèmes de dessins (clipping) avec un Canvas.

    Citation Envoyé par younes2727 Voir le message
    je vous remerci
    2- j'ai voulu séparer les classes d'une part pour disant rendre le code propre et d'autre part parcque j'ai voulu ajouter d'autre classe pour afficher l h histogramme gris d'image zoom image c'est pour ces raisons je veux décortiquer mon code et le mot que m'avait mentionner c'est **** alors il faudra lui passer la référence du JScrollPane se trouvant dans ta fenêtre principale**** c'est la clé que je cherche (comment le faire -referencer JScrollPane-)
    Ce n'est pas vraiment un problème de faire plusieurs classes (tout au plus, ta classe n'a aucune raison d'être un JPanel). mais le but de faire plusieurs classes est d'isoler du code qui en a besoin, parce que les éléments ont une raison d'être séparés. Ici, il n'y a aucune raison. Tout au plus, le chargement de l'image a une raison de l'être.
    Et pour passer la référence du JScrollPane, il sufft d'ajouter un paramètre de type JScrollPane et de passer ce paramètre lors de l'appel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       public LoadImage(JScrollPane jScrollPane1){
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private void jButton_Open_ImageActionPerformed(java.awt.event.ActionEvent evt) {                                                   
            new LoadImage(jScrollPane1);
        }
    En revanche, même si ça fonctionne, ce n'est pas très "académique" de faire ça par un constructeur. Il vaudrait mieux faire une méthode statique si tu tiens à faire une autre classe. Par exemple une méthode statique loadImage() qui retourne un JPanel avec la BufferedImage, ou un JLabel avec l'ImageIcon, que tu pourrais don appeler comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private void jButton_Open_ImageActionPerformed(java.awt.event.ActionEvent evt) {                                                   
            jScrollPane1.setViewportView( loadImage() );
        }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void jButton_Open_ImageActionPerformed(java.awt.event.ActionEvent evt) {                                                   
            Component component = loadImage();
            if ( component!=null ) {
                 jScrollPane1.setViewportView( component );
            }
        }
    pour gérer la possibilité de l'utilisateur d'annuler le chargement d'une image

    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
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.io.File;
     
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
     
    public class ImageDemo {
     
    	private static File lastDir;
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JScrollPane scrollpane = new JScrollPane();
    		frame.add(scrollpane);
     
    		JButton button = new JButton("Charger image");
    		button.addActionListener(e-> loadImage(scrollpane));
     
    		JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
    		buttonPanel.add(button);
    		frame.add(buttonPanel, BorderLayout.SOUTH);
     
    		frame.setSize(300,300);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	private static void loadImage(JScrollPane scrollpane) {
    		JFileChooser chooser = new JFileChooser(lastDir);
    		chooser.setDialogTitle("Choisir une image");
    		chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
    		if ( chooser.showOpenDialog(scrollpane)==JFileChooser.APPROVE_OPTION && chooser.getSelectedFile()!=null ) {
    			lastDir=chooser.getSelectedFile().getParentFile();
    			scrollpane.setViewportView(new JLabel(new ImageIcon(chooser.getSelectedFile().toString())));
    		}
     
    	}
     
    }
    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
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 74
    Par défaut pb resolu
    oui c'est vrai ,il me reste beaucoup de choses a aprendre
    donc voila ce que j'obtient

    LoadImage:j'ai ajouté une reference String pour recuperer le chemin de l'image et après l'utiliser dans la classse Histogram pour afficher son -image- histogramme

    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
     
    public loadImage(JScrollPane scrollpane, String path) throws IOException {
     
            JFileChooser chooser = new JFileChooser(lastDir);
            chooser.setDialogTitle("Choose img");
            chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
            if (chooser.showOpenDialog(scrollpane) == JFileChooser.APPROVE_OPTION && chooser.getSelectedFile() != null) {
                lastDir = chooser.getSelectedFile().getParentFile();
                path1 = chooser.getSelectedFile().getPath();
                // path1 = file1;
                System.out.println(path1);
                img = ImageIO.read(new File(path1));
                width = img.getWidth();
                height = img.getHeight();
                // System.out.println(lastDir);
                path = path1;
                scrollpane.setViewportView(new JLabel(new ImageIcon(chooser.getSelectedFile().toString())));
            }
        }
     
        public String getPath() {
            return path1;
        }
    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
     
     
    private void Ouvrir1ActionPerformed(java.awt.event.ActionEvent evt) {                                        
     
            try {
                loadImage loadImage1 = new loadImage(jScrollPane1, path1);
                path1 = loadImage1.getPath();
                image1 = ImageIO.read(new File(path1));
     
    //            width = image1.getWidth();
    //            height = image1.getHeight();
     
            } catch (IOException ex) {
                //Logger.getLogger(Main1.class.getName()).log(Level.SEVERE, null, ex);
            }
     
     private void Histo1ActionPerformed(java.awt.event.ActionEvent evt) {                                       
     
            Histogram histog = new Histogram(image1);

    si vous avez des conseilles Mr joel.drigo je l'apprécie beaucoup

    .Merci encore.

    Nom : Capture.PNG
Affichages : 798
Taille : 14,7 Ko

  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 : 55
    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
    Là, c'est dommage, tu lis 3 fois l'image, et pourquoi passer un path à la méthode, alors qu'on s'en sert pas dedans ? Et tu peux directement te servir de File, sans passer de File à String et repasser de String à File après...


    Tu pourrais faire (et ne lire alors qu'une seule fois le fichier) :

    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
    public class LoadImage {
     
    	private File lastDir;
    	private File path ;
    	private BufferedImage image;
     
    	public LoadImage(File defaultDir) {
    		lastDir=defaultDir;
    	}
     
            public void setDirectory(File defaultDir) {
    		lastDir=defaultDir;
            }
     
    	/**
             * 
             * @param scrollpane
             * @return true si une nouvelle image a été chargée, false si l'image n'a pas changé
             * @throws IOException
             */
    	public boolean loadImage(JScrollPane scrollpane) throws IOException {
     
            JFileChooser chooser = new JFileChooser(lastDir);
            chooser.setDialogTitle("Choose img");
            chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
            if (chooser.showOpenDialog(scrollpane) == JFileChooser.APPROVE_OPTION && chooser.getSelectedFile() != null) {
                File path = chooser.getSelectedFile();
     
                BufferedImage image = ImageIO.read(path ); 
                scrollpane.setViewportView(new JLabel(new ImageIcon(image)));
                this.image=image;
                this.path  =path ;
                lastDir=path .getParentFile();
                return true;
            }
            else {
            	return false;
            }
        }
     
        public File getFile() {
            return file;
        }
     
        public String getPath() {
            return file==null?null:file.toAbsolutePath().toString();
        }
     
        public BufferedImage getImage() {
    		return image;
    	}
     
        public int getWidth() {
        	if ( image==null ) {
        		return 0;
        	}
        	return image.getWidth();
        }
     
        public int getHeight() {
        	if ( image==null ) {
        		return 0;
        	}
        	return image.getHeight();
        }
     
    }
    Et si au lieu de créer une nouvelle instance de Loadimage à chaque fois, tu gardes la même, ça ouvrira le JFileChooser dans le dernier dossier ouvert avec succès de chargement d'image
    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
     
    private final Loadimage loadImage = new LoadImage(null);
    private void Ouvrir1ActionPerformed(java.awt.event.ActionEvent evt) {                                        
     
            try {
                if ( loadImage.loadImage(jScrollPane1) ) {
                     path1 = loadImage1.getPath();
                }
     
     
            } catch (IOException ex) {
                //Logger.getLogger(Main1.class.getName()).log(Level.SEVERE, null, ex);
            }
     
    }
     
    private void Histo1ActionPerformed(java.awt.event.ActionEvent evt) {                                       
     
            if ( loadimage.getImage()!=null ) {
            Histogram histog = new Histogram(loadimage.getImage());
            }
    }
    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 confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 74
    Par défaut
    Fantastique , vous avez tout à fait raison Mr joel.drigo
    J'ai appris beaucoup de choses au cours de ces discussions
    Je vous remercie du fond du coeur.

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

Discussions similaires

  1. Charger une image dans une variable avec IE7
    Par Loki13 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/02/2007, 15h19
  2. [TImageList] Charger une image dans un TImage
    Par xenos dans le forum Delphi
    Réponses: 5
    Dernier message: 17/05/2006, 18h30
  3. Charger une image dans un Timage
    Par michel71 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 29/04/2006, 08h55
  4. [Image] charger une image dans le main
    Par GLDavid dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 31/03/2006, 17h11
  5. Charger une image dans un thread
    Par KRis dans le forum Langage
    Réponses: 3
    Dernier message: 25/08/2005, 17h36

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