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 :

Canevas en Java


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut Canevas en Java
    bonjour,

    Je débute en java et souhaiterais créer le projet suivant :
    - une couche de dessin vectoriel ( des lignes), cette couche pouvant être visible ou invisible
    - des objets vectoriels (environ 20 cercles) qui se promènent par dessus
    - une zone de texte vectoriel relié par une ligne à un objet cercle qui bougent (translation instantanée) toutes les 4 secondes
    - récupérer les 'clicked', 'mouseover' de la souris sur ces même objects et sur la zone de texte correspondante pour réaliser diverses actions
    - pouvoir à l'aide de 2 boutons, zoomer ou dezoomer le tout (la couche de dessin et les objets+la zone de texte)

    1/ java peut-il faire cela sans librairies externes ?
    2/ quelles librairies me conseillez-vous autrement pour réaliser plus facilement un tel projet ?
    3/ je me pose surtout la question du zoom/dezoom ?
    4 / faut-il faire plusieurs jpanels : un pour le background vectoriel (les lignes) et un pour les objets vectoriels ou alors faire redessiner tout (le background + les objects toutes les 4s)
    5/ capter les evenements souris sur des objets vectoriels est-il facile (j'ai vu un tuto ou un mouselistener est mis sur le jpanel et ou on verifie si la position de la souris est sur l'objet ou y a-t-il qqchose de prévu pour cela ?)

    merci
    bon dimanche

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Par défaut
    bonjour,

    oui c'est possible, ton projet ressemble beaucoup à un écran radar sur lequel il y a des plots ( les cercles) et des étiquettes (le texte).

    1,2 - J'ai développé ce genre de projet avec swing qui est intégré dans java SE

    3 - pour le zoom dezoom j'utilise une classe échelle qui fait le rapport entre la largeur à afficher et la taille de la fenêtre et pareil pour la hauteur. J'utilise un JSlider pour modifier l'échelle et ça fonctionne bien sans ralentissement.


    4 - pour l'affichage du fond le mieux est de le mettre dans une BufferedImage qui sera en mémoire donc pas de perte de temps pour le réaffichage et quand tu zoom/dezoom tu modifies la BufferedImage. Je mets cette BufferedImage sur un JPanel et les éléments mouvants sur un autre JPanel au dessus. Je réaffiche tout à chaque fois car pas de problème de perfo sinon il est possible de ne redessiner que les choses qui changes

    5 - pour le mouselistener tu peux faire comme le tuto ça fonctionne parfaitement. Sinon tu peux mettre ton texte dans des JPanel et tu mets ton mouseListener sur ces JPanels

    bon courage

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut
    bonjour ludomacho,

    Je suis contrôleur aérien et effectivement je souhaite faire un simulateur de contrôle aerien en route. J'ai déjà réalisé ce projet avec mootools et la librairie vectoriel raphael en javascript. Tout fonctionne bien mais les drags d'étiquette sont un peu lents et les capteurs d'evênement ne sont pas rendus instantanément, c'est pourquoi je voulais le porter vers un langage plus rapide.

    Concernant la classe zoom pour la couche du dessous, est-ce le fait de mettre dans un bufferedimage permet de garder le dessin en vectoriel, et donc sans perte de qualité car je ne veux pas d'image bitmap ??

    Du coup, je pense utiliser des jpanels pour le texte mais chaque étiquette à environ 12 champs donc ça fait 12 jpanels. De plus ces 12 jpanels doivent former un groupe pouvant être 'dragged'.
    C'est possible de faire un groupe comme cela ?

    Merci beaucoup pour tes précieux conseils.
    Y'a plus qu'à coder et comme j'ai jamais fait de java avant, ça va être sportif !

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Mauvaise idée que d'utiliser des JPanels à cet effet.

    Il est recommandé pour ce genre de choses de n'utiliser qu'un seul JComponent qui dessinera l'ensemble des formes dans son paintComponent.

    Formes étant stockées dans un modèle, en utilisant l'interface Shape et ses implémentations, ou des wrappers autours de cette interface pour enrichir les fonctionnalités.

    Pour la gestion des sélections, il te faut combiner le MouoseListener du JComponent avec la méthode contains des shapes présentes.

    De même pour le Drag avec les MouseMotionListener.

    Et ainsi de suite.

    Un empilage de JPanels va s'avérer rapidement trèslourd, hyper chiant pour tout ce qui est gestion d'events et ainsi de suite.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut
    bonsoir sinok,

    Merci également pour tes conseils. Ca va me permettre de démarrer mon projet dans le bon sens.

    Donc j'utiliserai un seul jpanel qui va contenir mes graphismes vectoriels de cercles et de texte.
    Pour les évênements, j'ai compris c comme dans le tuto que j'ai vu.

    Par contre, pour l'image vectorielle de fond (les lignes), est-il préférable de la séparer dans un autre jpanel transparent ou de tout mettre dans un seul jpanel ? (c peut-être mieux pour la gestion du zoom ??)

    Sinon j'ai toujours la question de grouper les 12 textes ensembles pour faire du 'drag' du tout ? c possible facilement ?

  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
    Salut,

    le jpanel ou le jcomponent est un composant d'interface graphique qui te permet d'afficher ton dessin : si tu veux séparer plusieurs couches de dessin, ne cherche pas à utiliser plusieurs composants swing superposés transparent, mais créer plutôt un classe permettant de dessiner


    par exemple,

    tu créés une classe

    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
    public abstract class AbstractDrawer {
     
            private boolean visible;
     
            public AbstractDrawer() {
                 visible=true;
            }
     
            public abstract void draw(Graphics g, java.awt.Dimension size);
     
            /**
               * appeler repaint() à chaque fois qu'on modifie 
               */
            public void setVisible(boolean visible) {
               this.visible=visible;
            }
     
            public boolean isVisible() {
                return visible;
            }
     
    }
    dans ton jpanel (ou jcomponent) :

    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
    public class RadarPanel extends JPanel {
     
         private List<AbstractDrawer> drawers = new ArrayList<AbstractDrawer>();
     
         ...
     
         protected void paintComponent(Graphics g) {
               Dimension size = getsize();
               for(AbstractDrawer drawer : drawers) {
                    if( drawer.isVisible() ) {
                        drawer.draw(g, size);
                    }
               }
         }
     
         ...
     
         public void addDrawer(AbstractDrawer drawer) {
               drawers.add(drawer);
         }
     
         public void removeDrawer(AbstractDrawer drawer) {
               drawers.remove(drawer);
         }
     
         ... // etc toute méthode permettant de manipuler tes différents couches de dessin, en particulier des méthodes permettant de changer l'ordre des couches
     
     
     
     
     
    }

    ainsi tu peux séparer facilement chaque couche a dessiner, 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
    14
    15
    16
    public class GridLayer extends AbstractDrawer {
     
         public void draw(Graphics g, Dimension2D size) {
               for(int i=0; i<size.width; i+=20 ) {
     
                    g.drawLine(i,0,i,size.height);
     
               }
               for(int i=0; i<size.height; i+=20 ) {
     
                    g.drawLine(0,i,size.width,i);
     
               }
         }
     
    }
    etc...
    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.

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

Discussions similaires

  1. le Java est la continuité du C++ ???
    Par Vincent PETIT dans le forum Débats sur le développement - Le Best Of
    Réponses: 33
    Dernier message: 25/08/2005, 20h17
  2. Envoi de Datagrames par IP en JAVA
    Par the java lover dans le forum Développement
    Réponses: 2
    Dernier message: 14/08/2002, 11h44
  3. directx et java?? possible??
    Par jiraiya dans le forum DirectX
    Réponses: 3
    Dernier message: 09/07/2002, 19h55
  4. webcam : lire sur un port usb en c/c++ ou java. sous win. ?
    Par flo007 dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 24/05/2002, 23h24
  5. Service de nommage java C++
    Par Anonymous dans le forum CORBA
    Réponses: 3
    Dernier message: 15/04/2002, 12h48

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