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

 Java Discussion :

[Image] Gestion mémoire et les images


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Par défaut [Image] Gestion mémoire et les images
    Salut à tous,

    Je fais un viewer d'image un peu comme l'apperçu de windows, et le problème est que plus je fais défilé des images plus la mémoire utilisé est grande ( dans le gestionnaire des tâches de windows ). Alors qu'à chaque fois je fais un remove du JPanel contenant l'image.
    Comment je dois faire pour corriger ce problème ?
    Merci beaucoup.
    Car même quand je fait un dispose sur cette frame ( qui s'ouvre à partir d'une autre jframe ) cela ne fait pas baisser la mémoire utilisée.
    Help :p

    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
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    package IHM;
     
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
     
     
    public class frameViewer extends JFrame implements ActionListener, KeyListener{
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
     
     
    	Object[][] DATA;
     
    	int indice, sizeData;
    	String SUIVANT = ">>";
    	String PRECEDENT = "<<";
    	String FERMER = "CLOSE";
     
    	JPanel pane; 
    	JPanel central;
    	JPanel head;
     
    	afficheFichier comp;
     
     
    	JLabel labelNom, labelDate;
    	JTextField nomFichier, Date;
     
     
     
    	public frameViewer(int indiceDebut, Object[][]Data) {
    		// TODO Auto-generated constructor stub
    	pane = new JPanel();
    	pane.setLayout(new BorderLayout());
     
     
    	//setResizable(false);
    	//setUndecorated(true);
     
    	this.indice = indiceDebut;
    	this.setDATA(Data);
     
    	central = new afficheFichier(DATA[this.indice][0].toString()); 
    	pane.add(central,BorderLayout.CENTER);
     
     
    	setHeader();
     
     
    	JButton suiv = new JButton(SUIVANT);
    	suiv.addActionListener(this);
    	pane.add(suiv,BorderLayout.LINE_END);
    	suiv.setMnemonic(KeyEvent.VK_F);
     
    	JButton prec = new JButton(PRECEDENT);
    	prec.addActionListener(this);
    	pane.add(prec,BorderLayout.LINE_START);
     
    	JButton ferm = new JButton(FERMER);
    	ferm.addActionListener(this);
    	pane.add(ferm,BorderLayout.PAGE_END);
     
    	pane.add(head, BorderLayout.PAGE_START);
     
     
     
    	this.setFocusable(true);
    	this.addKeyListener(this);
    	add(pane);
     
     
     
    	}
     
    	public void setHeader(){
    		/*
    		 * Header
    		 */
    		head = new JPanel();
     
    		nomFichier = new JTextField();
    		nomFichier.setEditable(false);
    		nomFichier.setText(DATA[indice][0].toString());
     
     
    		labelNom = new JLabel(Internation.Langue.getAnInternationalizeString("fichier"));
    		labelNom.setLabelFor(nomFichier);
     
     
     
    		Date = new JTextField();
    		Date.setEditable(false);
    		Date.setText(DATA[indice][3].toString());
     
    		labelDate = new JLabel(Internation.Langue.getAnInternationalizeString("date"));
    		labelDate.setLabelFor(Date);
     
    		head.add(labelNom);
    		head.add(nomFichier);
     
     
    		head.add(labelDate);
    		head.add(Date);
     
     
    	}
     
     
    	public void showSuivant(){
    		/*
    		 * Affiche l'image ou le texte suivant
    		 */
    		if(indice < sizeData -1 )
    		{
    			//System.out.println("av " + indice + " " + sizeData);
     
    			indice+=1;
    			System.out.println("ap " + indice + " " + sizeData);
    			//System.out.println(DATA[indice][0].toString());
     
    			this.Reload();
    		}
     
    	}
     
    	public void showPrecedent(){
    		/*
    		 * Affiche l'image ou le texte suivant
    		 */
    		if(indice > 0)
    		{
    			//System.out.println(indice);
    			indice-=1;
    			System.out.println(indice);
    			//System.out.println(DATA[indice][0].toString());
    			this.Reload();
    		}
    	}
     
    	/**
             * @param dATA the dATA to set
             */
    	public void setDATA(Object[][] dATA) {
    		DATA = dATA;
    		sizeData = DATA.length;
    	}
     
     
     
    	public void Reload(){
     
     
    	nomFichier.setText(DATA[indice][0].toString());
    	Date.setText(DATA[indice][3].toString());
    	pane.remove(central);
    	central = new afficheFichier(DATA[indice][0].toString());
    	pane.add(central,BorderLayout.CENTER);
    	pane.repaint();
    	pane.validate();
     
     
    	}
    	@Override
    	public void actionPerformed(ActionEvent arg0) {
    		// TODO Auto-generated method stub
    		if(arg0.getActionCommand().equals(SUIVANT))
    		  		{
    				new Thread(new Runnable() {
    						public void run() {
    							showSuivant();
    							System.out.println(SUIVANT);
    						}
     
    				 }).start();
     
    		  		}
     
    		 if(arg0.getActionCommand().equals(PRECEDENT))
    	  		{
    			 new Thread(new Runnable() {
    					public void run() {
    						showPrecedent();
    			  			System.out.println(PRECEDENT);
    					}
     
    			 }).start();
     
    	  		}
    	  		if(arg0.getActionCommand().equals(FERMER))
    	  		{
    	  			System.out.println(FERMER);
    	  			dispose();
     
    	  		}
    	}
     
    	@Override
    	public void keyPressed(KeyEvent arg0) {
    		// TODO Auto-generated method stub
    		System.out.println(arg0 + "  " + arg0.getKeyCode());
     
    		if(arg0.getKeyCode() == 39 || arg0.getKeyCode() == 40){
    			this.showSuivant();
    		}
    		else if(arg0.getKeyCode() == 37 || arg0.getKeyCode() == 38){
    			this.showPrecedent();
    		}
     
    	}
     
    	@Override
    	public void keyReleased(KeyEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void keyTyped(KeyEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
     
     
    }

  2. #2
    Membre très actif Avatar de unknow0
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 452
    Par défaut
    Bonjour,

    toutes tes image sont (aparament) stocké dans un gros tableau donc tant qu'il y a une référence quelque par sur tes image elle ne seront pas libérer.
    De plus le GC passe quand il passe..

  3. #3
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 097
    Par défaut
    Sinon mais je ne conseillerais pas ...
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Sinon mais je ne conseillerais pas ...
    Exact, je ne vois d'ailleurs pas, du coup, ce que fait ce post là . Ne jamais appeler explicitement gc()!

  5. #5
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 097
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Exact, je ne vois d'ailleurs pas, du coup, ce que fait ce post là . Ne jamais appeler explicitement gc()!
    Je l'ai dit ... ne pas utiliser
    (J'ai dut l'utliiser dans le temps, je precise dans le temps, et ca m'a sauver la vie, tout en callant le programme pdt qlq secondes a chaque appel...)

    Edit : En effet, même voulant l'aider, un System.gc() n'est pas vraiment une aide il faut le reconnaitre.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Par défaut
    ça c'est ma classe qui permet d'afficher les images dans un JPanel

    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
    package IHM;
     
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
     
     
    public class afficheImage extends JPanel {
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
     
    	private BufferedImage sourceImage;
     
    	private int sourceImageWidth;
     
    	private int sourceImageHeight;
     
     
     
    	public afficheImage(File monImage) {
    		super();
    		initializePanel(monImage);
    	}
     
    	private void initializePanel(File monImage) {
    		//setPreferredSize(new Dimension(640, 480));
    		int width_screen = (Toolkit.getDefaultToolkit().getScreenSize().width )*4 / 5 ;
    		int height_screen = Toolkit.getDefaultToolkit().getScreenSize().height * 4 / 5;
    			try {
    				sourceImage = ImageIO.read(monImage);
     
     
    				sourceImageWidth = sourceImage.getWidth();
    				sourceImageHeight = sourceImage.getHeight();
     
    				if (sourceImageWidth > width_screen){
    					sourceImageHeight = sourceImageHeight * width_screen / sourceImageWidth;
    					sourceImageWidth = width_screen;
    				}
    				if ( sourceImageHeight > height_screen )
    				{
    					sourceImageWidth = sourceImageWidth * height_screen / sourceImageHeight;
    					sourceImageHeight = height_screen;
    				}
     
     
    				setPreferredSize(new Dimension(sourceImageWidth, sourceImageHeight));
     
    		} 
    		catch (IOException e) {
    			//e.printStackTrace();
    			this.add(new JTextArea("IMAGE NON TROUVE"));
    		}
    	}
     
    	public void paint(Graphics g){
     
    		int width = (sourceImageWidth);
    		int height = (sourceImageHeight);
    		Image img = sourceImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
    		g.drawImage(img,0,0,null);
     
    	}
     
     
    }


    Et voilà la partie du code affichefichiers qui appelle afficheimage
    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 afficheFichier extends JPanel{
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
     
    	/**
             * 
             */
    	Image img;
     
    	public afficheFichier(String nomFichier ) {
     
    //
     
    		else if(Outils.getExtension(nomFichier).equals("jpg") || Outils.getExtension(nomFichier).equals("tif")){
     
    		System.out.println("path" + Config.getPathblarchive() + nomFichier );
    		File fileImage = new File(Config.getPathblarchive() + nomFichier);
     
    		if(fileImage.exists()){
    			try {
    				img = ImageIO.read(fileImage);
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				//e.printStackTrace();
    				System.err.println("Image non trouvée");
    			}
    			add(new ImagePanel(img));
     
    		}
    voilà, je ne suis pas assez calé pour voir le pb

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ta classe afficheFichier, tu peux la montrer, après tout c'est elle qui charge tes images, ce serait bien de voir comment elle fonctionne. Si tu utilise du code qui utilise directement ou indirectement Toolkit.getImage(), il va y avoir du caching qui va entrer en ligne de compte

Discussions similaires

  1. Charger les images des diapos et les afficher
    Par Ciloe dans le forum jQuery
    Réponses: 0
    Dernier message: 22/02/2012, 23h22
  2. Réponses: 4
    Dernier message: 28/06/2011, 16h05
  3. Les images en CSS dans les mails HTML
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 04/02/2011, 18h02
  4. Programme C++ pour convertir les images tif ou JPG en image raw
    Par kruskal21 dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 29/01/2010, 22h09
  5. [Traitement d'image] Quelle format pour les images "boutons"
    Par byloute dans le forum Webdesign & Ergonomie
    Réponses: 1
    Dernier message: 26/02/2008, 10h25

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