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

Composants Java Discussion :

[Image] dessiner plusieurs images


Sujet :

Composants Java

  1. #1
    Membre régulier Avatar de rgomes
    Homme Profil pro
    IT Developer JAVA Senior
    Inscrit en
    Juin 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : IT Developer JAVA Senior
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 128
    Points : 76
    Points
    76
    Par défaut [Image] dessiner plusieurs images
    Hello,

    Je souhaite dessiner une map, un carré constitué de 5 images de cotés (soit 25 images). Je cherche la bonne stratégie

    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
     
    public class Map extends JFrame{
        public static void main(String[] a) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new Map();
                }
            });
        }
     
        public Map(){
            setBounds(300, 300, 300, 300);
            setVisible(true);
            getContentPane().add(new Canvas());
            repaint();
        }
    }
     
    public class Canvas extends Component {
        private static final long serialVersionUID = 1L;
        public Canvas() {
            super();
        }
     
        @Override
        public void paint(Graphics g) {
            int x = 0;
            int y = 0;
            for (int i = 0; i < 25; i++) {            
                 Image img1 = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/icons/grass.jpg"));
                g.drawImage(img1, x, y, this);
                if ((i+1) % 5 == 0) {
                    y += 32;
                    x = 0;
                } else {
                    x += 32;
                }           
            }
            g.dispose();
        }
    }
    J'ai plusieurs interrogations :
    - est-ce la bonne stratégie si je veux construire une map à partir d'icone ?
    - dois-je à chaque créer une nouvelle instance de l'image
    - autre problème : je rentre plusieurs dans la méthode paint !

    Merci pour vos avis !
    Images attachées Images attachées  

  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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par rgomes Voir le message
    Hello,


    J'ai plusieurs interrogations :
    - est-ce la bonne stratégie si je veux construire une map à partir d'icone ?
    boucler sur 0 à 25, ou boucler avec 2 boucles de 0 à 5, sont des méthodes valables pour faire ce genre de chose (après on peut faire un modulo et une division entière pour déterminer le x et le y, plutôt que comme tu fais, mais c'est plus ou moins pareil)
    tu peux éventuellement utiliser une TexturePaint pour dessiner des applats constitués d'une répétition du même motif : cela rend plus facile des remplissages quelconques (rectangle, ou disque, ou polygone, ou lettres si tu veux)

    - dois-je à chaque créer une nouvelle instance de l'image
    non ce n'est pas nécessaire, et je dirais même plus qu'il ne vaut mieux pas le faire : tu la charges dans une constante une fois pour toute, alors que la charger à chaque fois est consommateur de cpu et d'io disque (et/ou de cache disque du moins)

    - autre problème : je rentre plusieurs dans la méthode paint !
    C'est normal : elle sera invoquée chaque fois que SWING estimera nécessaire de la redessiner. Mais elle ne sera pas invoquée si ce n'est pas nécessaire, à moins que tu forces l'invocation.

    EDIT : je pense à un truc supplémentaire, éventuellement tu peux dessiner ton "terrain" dans une nouvelle image conservée en variable membre de ta classe à chaque fois qu'une variation implique de la redessiner, et dans la paint tu dessine l'image d'un bloc. Ca prendra plus de mémoire, mais ça ira plus vite, d'autant plus vite si ton "terrain" ne change pas souvent.

  3. #3
    Membre régulier Avatar de rgomes
    Homme Profil pro
    IT Developer JAVA Senior
    Inscrit en
    Juin 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : IT Developer JAVA Senior
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 128
    Points : 76
    Points
    76
    Par défaut
    Merci pour ta reponse claire et rapide.
    Si lamethode paint est appelee plusieurs fois alors je ne draw pas 25 images mais x fois 25 ?! Donc il y a un probleme de conception ? Car dans mon component canvas j insere mes 25 images. Ne faut-il pas 1 component pour 1 image ? ImageIo me load entierement l image mais cest tres lent.

  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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par rgomes Voir le message
    Merci pour ta reponse claire et rapide.
    Si lamethode paint est appelee plusieurs fois alors je ne draw pas 25 images mais x fois 25 ?! Donc il y a un probleme de conception ?
    Non. La méthode paint est toujours appelée lorsque c'est nécessaire (par exemple, si on redimensionne la fenêtre. C'est normal et c'est toujours comme ça.

    Citation Envoyé par rgomes Voir le message
    Car dans mon component canvas j insere mes 25 images. Ne faut-il pas 1 component pour 1 image ?
    oui, c'est une solution, si tu voulais par exemple faire un système interactif ou on peut cliquer par exemple sur chaque image indépendamment (ce qu'on peut faire toutefois avec un seul composant). Mais pour dessiner, autant dessiner dans un seul canvas. Avec plusieurs composants tu auras le problème supplémentaire de placement des différents composants et éventuellement des difficultés pour dessiner entre 2 composants. Après, il existe aussi des apis qui gère une surcouche du canvas, qui permet de gérer chaque image dans un composant indépendant (mais pas swing). Tout dépend du but final. Pour remplir une surface avec un motif qui se répète, la classe TexturePaint est une solution simple également.
    Citation Envoyé par rgomes Voir le message
    ImageIo me load entièrement l image mais cest tres lent.
    C'est lent certes, mais c'est pas normal si c'est très lent. Maintenant "lent" ou "très lent" sont très relatifs. Les accès disques plus le temps de décodage du fichier sont évidemment particulièrement lent par rapport à d'autres types de traitement, comme le dessin d'image par exemple. C'est pour ça que je te proposais de charger l'image dans une constante (final static ) qui sera chargée au démarrage (à la création de la classe dans laquelle tu vas la déclarer) et tu pourras la redessiner autant de fois que nécessaire, dans n'importe quel composant, et n'importe ou dans le composant (et plusieurs fois dans le même composant) sans reconsommer le temps de chargement et de décodage.

Discussions similaires

  1. [Débutant] Manipulation d'images : intégrer une image dans une image
    Par noscollections dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/10/2014, 11h51
  2. Assemblage de plusieurs images vers une image
    Par cameleon59 dans le forum Langage
    Réponses: 5
    Dernier message: 18/06/2012, 13h16
  3. Diviser 1 image en plusieurs images (plusiers fichier)
    Par olonash dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 12/03/2010, 08h22
  4. Construire une image avec plusieurs images
    Par Twubi dans le forum Qt
    Réponses: 3
    Dernier message: 04/01/2010, 15h26
  5. Réponses: 6
    Dernier message: 03/04/2007, 20h40

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