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

2D Java Discussion :

ArrayList de 500 objets : ça rame


Sujet :

2D Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 31
    Points : 13
    Points
    13
    Par défaut ArrayList de 500 objets : ça rame
    Bonjour,

    j'espère que je suis dans la bonne partie du Forum.

    Le titre est assez parlant, je récupère 500 lignes (15 colonnes) d'une base de données (pour le moment, au final il y en aura au moins 2 fois plus), construit un objet contenant chaque colonne de la ligne récupérée et enregistre ces 500 objets dans une ArrayList.

    L'objet contient une image passée en argument, chargée UNE SEULE FOIS (au démrage du programme).
    C'est une imageCompatible...

    Lorsque je souhaite récupérer des données précise, je parcours l'ArrayList avec un iterator comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (Iterator<Text> it = alText.iterator(); it.hasNext(); ) 
    {	
      Text iText = it.next();
      ...
    Lorsque je n'avais que 200 objets, ça ne rammait pas du tout, maintenant que j'en ai plus de 2 fois plus, ça ramme...
    Le MouseDragged met 3 secondes à s'effectuer...

    Le modérateur Bouye m'a montré comment "tricher" lors d'un drag en créant une seule image avec TOUTES celles qui existent... mais ça lagg quand même...

    Je pense du coup qu'il faut encore trouver autre chose pour optimiser le programme...

    Je pense que le souci vient de la lecture de la liste...

    Je n'ai pas créé de threads manuellement... peut être est ce une raison ??

    Y a t il une manière de gérer la lecture de super grande listes ?
    Je n'ai pas encore essayé le lire seulement une partie de la liste totale, en fonction de ce qui est visible à l'écran... Je viens tt juste d'y penser...

    J'espère que vous saurez me donner une piste...
    Merci !

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Désolé mais je n'ai pas tout compris.
    Tu parles de liste, d'image, de MouseDragged ...
    Que souhaites-tu faire avec ta liste d'objets ?
    Que viennent faire l'image et le MouseDragged ?
    Si tu expliques un peu mieux, on pourra peut-être mieux t'aider.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu peux nous montrer le code de lecture de ta base de données?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    je réexplique

    Je fais une sorte de carte interactive, et j'ai besoin d'une image de fond sur laquelle je mets pleins d'autres images.
    Ces images font partie d'un objet "Item".

    Je récupère 500 lignes (sur 15 colonnes) d'une base de données (pour le moment, parcequ'au final il y en aura au moins 2 fois plus).
    Avec, je construit autant d'objets "Item" et les mets dans une ArrayList puisque j'ai besoin d'accéder à leurs informations à différents endroits du programme.

    Chaque objet "Item" contient une image passée en argument, chargée UNE SEULE FOIS (au démarage du programme).
    C'est une imageCompatible...

    Lorsque je souhaite récupérer des données précise, je parcours l'ArrayList avec un iterator comme cela :
    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (Iterator<Text> it = alText.iterator(); it.hasNext(); ) 
    {	
      Text iText = it.next();
      //par exemple iText.getX(); ...
    Lorsque je n'avais que 200 objets, je pouvais faire un MouseDrag de TOUTES les images de manière très fluide, maintenant que j'en ai plus de 2 fois plus, ça ramme...
    Le MouseDragged met 3 secondes à s'effectuer...

    Le modérateur Bouye m'a montré comment "tricher" lors d'un drag en créant une seule image avec TOUTES celles qui existent... mais ça lagg quand même...

    Je pense du coup qu'il faut encore trouver autre chose pour optimiser le programme...

    Y a t il une autre manière de gérer la lecture de super grande listes parceque c'est peut être de la que vient le souci... ?

    Sinon, voila le comment je charge les objets "Item"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //Dans la classe principale
    GestionBDD SqlObj = new GestionBDD();			
    String[][] stringValues = new String[nbRows][nbColumns];			
    stringValues = SqlObj.getItemValues();
    puis je crée un nouvel objet Item que j'ajoute à mon ArrayList
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alItem.add(new Item(image, ...valeurs de la BDD...));
    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
    //getItemValues() de la classe GestionBDD
    try {	
    ResultSet result = stat.executeQuery("SELECT * FROM \"item\";");
    int i=0;
    while(result.next())
    {				
      tbl[i][0] 	= result.getString("id");
      tbl[i][1] 	= result.getString("equipment_type");
      tbl[i][2] 	= result.getString("pole_type");
    ...
    }
    result.close();
    stat.close();
    }
    catch (SQLException e) { e.printStackTrace(); }
    return tbl;
    je c pas si C ça qui cloche...

    je vois pas du tout quoi tenter pour accélérer le programme...

    Merci, gspr que C plus clair...

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    d'après ta description, ta liste a rien a voir avec le problème, ce serait plutot le paint() de ton composant qui est trop lent. As-tu déjà mesuré à quelle vitesse tu est capable de redessiner ton affichage?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    ola je c pas du tout cmt on calcul ce temps... ??

    quand je passe le curseur sur une image, elle est replacée par une autre, pour montrer à l'utilisateur que quelquechose se passe...
    et avec les 500 enregistrement c'est vachement lent.
    C'est ptet le paint, mais ya une condition qui consiste à vérifier la position X et Y du curseur est sur l'image (coin en haut à gauche et coin en haut à gauche + hauteur et + largeur). Mais pour ça, j'ai besoin de vérifier dans TOUTE la liste si ya des coordonnées qui vérifient cette condition...

    c pour ça que jpense que c'est le parcours de la liste le souci...
    G entendu parler de Intersect, mais j'arrive pas à la faire fonctionner..

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    faire une boucle sur une lsite de plusieurs millier d'objets pour vérifier une condition simple prend à peine 2 ~ 3 ms en java, je pense pas que tes objets posent problème. Pour calculer le temps de ton paint, c'est pas très dur. Au début de la méthode paint tu mesure le System.currentTimeMillis() et à la fin de la méthode paint, tu fait la même mesure. t'aura le temps que te met un paint() à s'exécuter. Affiche nous ton code de paint si t'as des doutes, mais parcourir un liste de 500 entrée c'est vraiment négligeable. Par contre redessiner 500 images, c'est loin d'être négligeable

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Voilà un code de test pour ton intersection et le parcours de boucle. Comme tu vois, ce genre de calcul n'influence pas tes performances:

    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
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
     
     
    public class TestList {
     
    	private static class Item{
    		private int x;
    		private int y;
    		private int width;
    		private int height;
    		public Item(int x, int y, int width, int height){
     
    		}
    		// getters , setters retiré pour la clareté
    	}
    	public static void main(String[] args) {
    		List<Item> items = new ArrayList<Item>();
    		Random r = new Random();
    		for (int i = 0; i < 5000; i++){
    			items.add(new Item(r.nextInt(800), r.nextInt(500),r.nextInt(30)+10,r.nextInt(30)+10));
    		}
    		int x = r.nextInt(840)+1;
    		int y = r.nextInt(540)+1;
    		List<Item> selected = new ArrayList<Item>();
    		long time1 = System.currentTimeMillis();
    		for (int j = 0; j< 10000; j++){
    			for (Item i : items){
    				if (i.getX()<=x && i.getY()<=y && i.getX()+i.getWidth()>=x && i.getY()+i.getHeight()>=y)
    					selected.add(i);
    			}
    		}
    		long time2 = System.currentTimeMillis();
    		System.out.printf("Operation took %d milliseconds, %f nanoseconds per list, %f nanosecond per item\n", (time2-time1), (time2-time1)/10f,(time2-time1)/10f/5000f);
    		System.out.printf("At 50 images per second, we could calculate %f collision per refresh\n", 20f/((time2-time1)/10000f/5000f));
    	}
     
    }
    Et voilà la sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Operation took 589 milliseconds, 58,900002 nanoseconds per list, 0,011780 nanosecond per item
    At 50 images per second, we could calculate 1697792,875000 collision per refresh

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    OK
    merci pour l'exemple, ça rassure un peu déjà

    voici mon code de paintComponent.
    J'utilise repaint(x,y,w,h) lorsque je passe le curseur au dessus d'une image et qu'elle soit modifiée, donc je ne redessine pas 500 images, mais juste une normalement...

    Pour le MouseDragged, dans MouseDragged() j'incrémente les variables de position X et Y de chaque objet "Item" (les images) et les redessine dans le paintComponent.

    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
    protected void paintComponent(Graphics g) 
    {      
    double a=System.currentTimeMillis();
     
    Graphics2D g2d = (Graphics2D) g.create();
    Graphics g2 = g.create();
     
    try 
    {
    if (isDragging & init==false) 
    {
      renderOffscreen(g2d,"dragging");
    }
    else if(isMoving & init==false)
    {
      renderOffscreen(g2d,"moving");
    }
    else 
    {
      renderDirectly(g2);
    }
    }
    finally 
    {
    g2d.dispose();
    g2.dispose();
    }
    double b=System.currentTimeMillis();
    System.out.println(b-a); //en général 150ms ... 300ms parfois
    }
     
    protected void renderDirectly(Graphics g)
    {
      init = false;
      super.paintComponent(g);
     
      //draw the Items
      for (Iterator<Item> it = alItem.iterator(); it.hasNext(); ) 
      {
        Item iItem = it.next();
        iItem.drawItem(g);
      }
    }
     
    //create Compatible Images for graphic optimizations
    public static BufferedImage createCompatibleImg(BufferedImage pic, String loc) 
    {
    GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
     
    if (pic.getColorModel().equals(gc.getColorModel())) 
    {
      return pic;
    } 
    else 
      {
        BufferedImage newCompatibleImage = gc.createCompatibleImage(pic.getWidth(),pic.getHeight(),pic.getTransparency());  
     
        Graphics g = newCompatibleImage.getGraphics();
        g.drawImage(pic, 0, 0, null);
        g.dispose();
        return newCompatibleImage;
      }
    }
     
    void createPaneImage() 
    {
      Dimension size = this.getSize(); //taille du Panel, de la partie visible de la carte quoi...
     
    if (offscreen == null || offscreen.getWidth() != size.width || offscreen.getHeight() != size.height) 
    {
    GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
    offscreen = gc.createCompatibleImage(size.width, size.height); 
    }
     
    Graphics2D g = offscreen.createGraphics(); //Graphics g changé en g2D
     
    try {
    renderDirectly(g);
    }
    finally {
    g.dispose();
    } 
    }
     
    protected void renderOffscreen(Graphics2D g, String mode) 
    {
    super.paintComponent(g);
     
    //draw rules when Drag
    if(mode.compareTo("dragging")==0)
    {
    if (offscreen == null) 
    {
      createPaneImage();
    }
     
    if (dragX != 0 || dragY != 0) 
    {
      for (Iterator<Item> it = alItem.iterator(); it.hasNext(); ) 
      {
    	  Item iItem = it.next();
     
    	  if(iItem.getVisibility()) //if visible (for the box)
    	  {
    		if(iItem.getLoc()!=null)
    	    g.drawString(iItem.getLoc(), iItem.getLocX(), iItem.getLocY());
    		g.drawImage(iItem.getImgToDraw(), iItem.getX(), iItem.getY(), iItem.getW(), iItem.getH(), null);
    	  }
      }
    }
    }
     
    //draw rules when Move
    else if(mode.compareTo("moving")==0)
    {
    Shape clip = g.getClip();
     
    final int clipX = clip.getBounds().x;
    final int clipY = clip.getBounds().y;
    final int clipXwidth = clip.getBounds().x + clip.getBounds().width;
    final int clipYheight = clip.getBounds().y + clip.getBounds().height;
     
    for (Iterator<Item> it = alItem.iterator(); it.hasNext(); ) 
    {
      Item iItem = it.next();
     
      Pattern pattern_Item = Pattern.compile("^./images/Item/");
      Matcher matcher_Item = pattern_Item.matcher(iItem.getPath());  
     
      Pattern pattern_Box = Pattern.compile("^./images/Box/");
      Matcher matcher_Box = pattern_Box.matcher(iItem.getPath());  
     
      if(clipXwidth==getIndexX(getIndex(iItem.getName()))+getIndexW(getIndex(iItem.getName())) & clipX==getIndexX(getIndex(iItem.getName())) & clipYheight==getIndexY(getIndex(iItem.getName()))+getIndexH(getIndex(iItem.getName())) & clipY==getIndexY(getIndex(iItem.getName())))
      {
    	if(matcher_Item.find()==true)
    	{
    	  //pour vérifier si la zone de clip est bonne... et OUI, elle l'est
    	  System.out.println("clip "+iItem.getName()+" "+clipX+"x"+clipY+" "+clipXwidth+"x"+clipYheight);
     
    	  g.setColor(new Color(134,55,83));
    	  g.fillRect(clipX-space2pole+iItem.getW()/2,clipY,clipXwidth+2*space2pole+2*iItem.getW(),clipYheight);
     
    	  if(iItem.getVisibility()) //if visible (for the box)
    	  g.drawImage(iItem.getImgToDraw(), clipX, clipY, iItem.getW(), iItem.getH(), null);
    	}
     
    	if(matcher_Box.find()==true)
    	{
    	  //draws the BoxClose/Over
    	  g.drawImage(iItem.getImgToDraw(), iItem.getX(), iItem.getY(), null);
    	}
      }
    }
    }
    }
    Je vais continuer à regarder ce qui peut clocher dans le programme...

  10. #10
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    2 questions :
    1. Pourquoi créer 2 Graphics au début de paintComponent() ???
    2. Si je comprend bien renderDirectly() correspond à ta méthode de dessin en standard ? Dans ce cas tu redessines tous les composants à chaque fois


    Pour que repaint(x,y,w,h) soit utile tu dois gérer la zone de clip de ton Graphics dans paintComponent()...


    [edit] Je me suis arrêté là je n'ai pas trop compris le reste du code...

    a++

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Que dit ton system.out.println. Y a-t-il beaucoup d'images pour lesquels tu ne redessine pas car pas dans le clip? Comment la méthode paint() est-elle appelée?

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    Mon system.out.println dit
    "clip Pole1_std 97x211 177x393" => c bien ce que je souhaite
    C le bon clip.

    Je redessine avec repaint(iItem.getX(),iItem.getY(),iItem.getW(),iItem.getH()); lorsque je suis sur l'image que je souhaite redessiner.

    Mais malgré cela, ça met du temps à s'éxécuter, genre 1 seconde ou plus.

    Et effectivement, il y a beaucoup d'image que je ne redessine pas : NombreTotalD'image - celleQueJeSouhaiteRedessiner... 499 pour le moment...

    Pour le drag, effectivement je fait repaint(), mais lorsque je met des println dans mon paintComponent, je vois que c'est la partie "dragg" qui est solicité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
    try 
    {
      if (isDragging & init==false) 
      {
        system.out.println("Dragg !");
        renderOffscreen(g2d,"dragging");
      }
      else if(isMoving & init==false)
      {
        system.out.println("move !");
        renderOffscreen(g2d,"moving");
      }
      else 
      {
        system.out.println("redessine tout !");
        renderDirectly(g2d); //methode de dessin standard
      }
    }
    (ce qui répond à ta deuxième question adiGuba)
    Sinon j'ai viré les 2e graphic que je créais... j'avais dû l'oublier...
    en tout cas ça change rien...

  13. #13
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    A quoi sert ton graphics "offscreen" ?

    dans renderOffscreen(), a quoi correspond le getVisibility() sur les item ? (apparemment c'est lui qui détermine si l'item doit être dessiné ou pas)

    en mode "moving", crées les Pattern une fois pour toutes et non pas à chaque itération de la boucle (la création du pattern peut être assez couteuse).


    Sinon : pourrais-tu expliquer la différence entre les trois méthodes de dessin... car cela reste très flou pour moi

    a++

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    peux tu rajouter une mesure de temps là autour?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	  if(iItem.getVisibility()) //if visible (for the box)
    	  {
    		if(iItem.getLoc()!=null)
    	    g.drawString(iItem.getLoc(), iItem.getLocX(), iItem.getLocY());
    		g.drawImage(iItem.getImgToDraw(), iItem.getX(), iItem.getY(), iItem.getW(), iItem.getH(), null);
    	  }

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    le graphics "offscreen" ... c'est ce que Bouye m'avait donné dans l'avant dernierère réponse : http://www.developpez.net/forums/d79...s/#post4592986

    C'est pour créer une seule image avec tout ce qui est déjà dessiné.
    C'est utilisé pour le drag, comme ça, à la place de déplacer 500 images, on en déplace qu'une...
    Je pense que c'est ce que ça fait... :$

    dans renderOffscreen(), getVisibility() retourne TRUE ou FALSE. Lorsque je clique sur un "Item", une image "Item" s'affiche. Je souhaite qu'elle ne soit pas toujours visible puisque je charge sons image dès le lancement du programme. Donc je la dessine selon sa visibilité, donnée par getVisibility().

    Sinon la différence entre les trois méthodes de dessin :
    renderDirectly(g2d) => dessine tout "sans se poser de question"
    renderOffscreen(g2d,"dragging"); => dessine lorsque qu'un drag est en cours
    renderOffscreen(g2d,"moving"); => dessine lorsque le curseur bouge (mousseMoved) (c'est pour le changement de l'image lorsque le curseur passe dessus)

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    je ne sais pas ce que vous en pensez, mais il y a un truc qui cloche quand on regarde bien...

    à chaque fois que je créé un nouvel "Item", je CHARGE l'image qui lui correspond.
    Ceci ne se fait qu'au chargement du programme, et vu que l'image est passée en argument de l'objet "Item".
    Du coup, je récupère sa largeur et hauteur dans le constructeur de l'objet "Item" et les stocks dans des attributs de l'objet, donc je ne lis plus jamais l'image du disque dur.

    Le problème, c'est que s'il y a 500 objets... il y a quand même 500 images chargées dans "la mémoire du programme" et c'est peut être ça qui ralenti tout...

    Du coup, j'ai essayé de ne charger les images que le nombre de fois minimum.
    Pour cela, je créé le 1er objet "Item" avec la bonne image (que je charge).
    Ensuite, avant de créer un nouvel objet "Item", je compare l'image de l'"Item" précédent avec celle que je devrais dessiner.
    Si c'est la même, je copie l'"Item" précédent et change ses attributs avec des setters...
    Comme ça, l'image reste en mémoire quelquepart UNE SEULE FOIS, et je la dessine à des positions différentes propres à chaque objet "Item".

    => Mais ça ne marche pas, c'est l'image du 1er objet créé qui est déplacée en fonction des setters du dernier objet créé...

  17. #17
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par baltam Voir le message
    le graphics "offscreen" ... c'est ce que Bouye m'avait donné dans l'avant dernierère réponse : http://www.developpez.net/forums/d79...s/#post4592986
    Je veux bien... mais tu ne l'utilises JAMAIS ! Du coup je ne comprend pas trop son utilité !


    Citation Envoyé par baltam Voir le message
    renderDirectly(g2d) => dessine tout "sans se poser de question"
    Ici aussi tu devrais gérer la zone de clipping...

    Citation Envoyé par baltam Voir le message
    renderOffscreen(g2d,"dragging"); => dessine lorsque qu'un drag est en cours
    Et graphiquement cela doit se traduire par quoi ?
    renderOffscreen(g2d,"moving"); => dessine lorsque le curseur bouge (mousseMoved) (c'est pour le changement de l'image lorsque le curseur passe dessus)[/QUOTE]
    Le code de cette partie me semble quand même assez compliqué pour simplement changer une image...

    Citation Envoyé par baltam Voir le message
    Le problème, c'est que s'il y a 500 objets... il y a quand même 500 images chargées dans "la mémoire du programme" et c'est peut être ça qui ralenti tout...
    Non cela ne ralenti rien : ca occupe seulement plus de mémoire...

    Citation Envoyé par baltam Voir le message
    Comme ça, l'image reste en mémoire quelquepart UNE SEULE FOIS, et je la dessine à des positions différentes propres à chaque objet "Item".
    Si tu dois dessiner plusieurs fois la même image, alors oui il serait préférable de ne pas la charger plusieurs fois... mais c'est principalement pour éviter de surcharger la mémoire...

    Citation Envoyé par baltam Voir le message
    => Mais ça ne marche pas, c'est l'image du 1er objet créé qui est déplacée en fonction des setters du dernier objet créé...
    Ce qui me donne ma dernière question : à quoi corresponde tes Items ?

    a++

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    Je veux bien... mais tu ne l'utilises JAMAIS ! Du coup je ne comprend pas trop son utilité !
    jpensais que ça le faisait puisque renderDirectly() est appelée... sinon jvois pas comment l'utiliser...

    Ce qui me donne ma dernière question : à quoi corresponde tes Items ?
    eh ben, c'est une image avec des propriétés supplémentaire.
    Notamment les informations que je récupère de la base de données.
    Comme ça, lorsque je clique sur une image (un objet "Item" donc) je peux afficher des données qui lui sont propres (positions, nom, ...).

  19. #19
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par baltam Voir le message
    jpensais que ça le faisait puisque renderDirectly() est appelée...
    Mais c'est à toi de l'utiliser. renderDirectly() se contente de tout affihé sans utiliser la zone offscreen

    Citation Envoyé par baltam Voir le message
    sinon jvois pas comment l'utiliser...
    A mon avis c'est le problème avec ton code : tu veux faire de tout avec des idées prises à gauche et à droite, mais cela n'a pas beaucoup de sens...


    Citation Envoyé par baltam Voir le message
    eh ben, c'est une image avec des propriétés supplémentaire.
    C'est à dire ?
    On ne sait toujours pas ce que tu veux affiché, ni comment, ni les différences exactes à l'affichage entre les trois modes. Je suis désolé mais je n'arrives pas à comprendre tout cela avec ton code, donc ce serait bien que tu l'expliques...


    a++

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    A mon avis c'est le problème avec ton code : tu veux faire de tout avec des idées prises à gauche et à droite, mais cela n'a pas beaucoup de sens...
    Jfais ce que je peux... j'avais bien des idées au début, mais on m'a proposé ce code vu que le mien n'était pas optimisé...

    On ne sait toujours pas ce que tu veux affiché, ni comment, ni les différences exactes à l'affichage entre les trois modes. Je suis désolé mais je n'arrives pas à comprendre tout cela avec ton code, donc ce serait bien que tu l'expliques...
    Je veux juste afficher une image... j'ai une image de fond... et je veux en mettre d'autres par dessus... comme une carte...
    mais j'ai besoin de préciser à quel endroit on place l'image, quelle taille elle aura, à quelle information de la base est elle liée...
    je vois pas quoi expliquer de plus.

    Il y a différent comportement selon que l'on clique sur l'image, ou si l'on passe le curseur dessus.
    Au début, j'ai utiliser les mousseListener et mouseMotionListener directement dans l'objet "Item" représentatn l'image, mais je n'arrivais pas à les faire marcher...
    Donc tout a été regroupé dans la classe principale.
    Et c'est dans cette classe principale que se trouve paintComponent() et les autres fonctions que j'ai donné plus haut

    Sinon, dans renderOffscreen, il y a deux conditions ; soit on fait un mousedrag soit on fait un mousemove...

    pour le mouseMove par exemple :
    je récupère un clip
    parceque je fais pas repaint() maos repaint(x,y,w,h)
    dans le carré x, y, w+x, y+h, ya l'image que je veux modifier.
    Donc je cherche quelle image de mon ArrayList (alItem) se trouve dans ce carré, et je fait un drawImage à cet endroit ensuite (mais avec une autre image qui est l'image qui apparait lorsque mon curseur est au dessus)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Problèmes avec ArrayList] Supprimer des objets égaux à null
    Par smutmutant2003 dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 08/10/2009, 10h43
  2. [ArrayList] removeAll d'objets egaux
    Par Lady dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 24/09/2007, 10h32
  3. Serialisation/deserialisation d'un arrayList retourne des objets vides
    Par cdtkoenig dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 18/07/2007, 15h45
  4. Réponses: 1
    Dernier message: 18/01/2006, 18h39
  5. [ArrayList]transformer l'objet récupéré en double...
    Par snoop dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 16/07/2004, 16h16

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