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 :

Superposer & rendre independant 2 elem graphique


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Par défaut Superposer & rendre independant 2 elem graphique
    Bonsoir,

    je voulais avoir des précisions sur tout ce qui est graphique.

    Quelques questions pour commencer :

    Lorsque l'on crée une classe et que l'on emploit la méthode
    protected void paintComponent(Graphics g) {}
    Selon la mise en place d'une condition qui empecherait le code qui suit de s'executer; cette méthode, si j'ai bien compris, est en callback donc pas besoin de l'appeller, c'est bien ca ?

    J'en viens au point qui m'interesse, est il possible de créer une autre méthode qui peindra donc un deuxième element graphique dans la même classe et indépendant du premier et comment procéder?

    Enfin, est il possible de superposer ces deux éléments ? comme lorsque sur une seule méthode paint, on crée un élément en premier, puis l'autre et le second se retrouve sous le premier ?




    Pour vous donner une meilleure idée de ce que je souhaite réaliser :
    Les traits gris que vous voyez en fond du chronogramme, je voudrais les rendre totalement independant de la fonction paintComponent qui gère les traits noirs représentant les états des entrées et sorties.
    Ca me permettrait aussi de commencer à envisager la possibilité d'agir en cliquant sur les traits noir et d'entrainer une action sans modifier les traits gris, si cela est possible.

    Merci et bonne soirée

  2. #2
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Par défaut
    Ai je posé des questions dures ou trop banales ?_?
    Merci pour votre aide.

  3. #3
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Pourquoi ne pas tout simplement te faire deux méthodes pour déssiner le fond et les traits, et que tu appelleras depuis paintComponent() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    		protected void paintBackground(Graphics g) {
    			// ...
    		}
     
    		protected void paintForeground(Graphics g) {
    			// ...
    		}
     
    		@Override
    		protected void paintComponent(Graphics g) {
    			paintBackground(g);
    			paintForeground(g);
    		}
    De toute manière lorsque tu changes un de tes traits noirs, tu es obligé de repeindre le fond de ton histogramme également...

    Tu pourrais eventuellement utiliser une BufferedImage qui contiendra ton fond, et qui sera affiché tels quels... mais je ne sais pas si ce serait forcément mieux :
    • Il faudrait que tu gères les redimensionnements de ton composant (s'il est redimensionné tu devra modifié ta BufferedImage).
    • Le dessin du fond n'est pas bien complexe puisqu'il n'y a que quelques lignes, cela ne doit pas être couteux de le recréer à chaque fois...


    a++

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Par défaut
    Merci beaucoup pour ces précieux conseils, j'ai pu contourner le problème(apparemment).
    Sinon je voulais savoir, j'ai encore un petit problème.

    J'ai une classe Rule qui s'occupe de créer la règle en haut du chronogramme.
    c'est un JPanel et via un Wizard, j'ai fait en sorte de redéfinir la valeur la plus grande affichée de cette règle.
    Par exemple, si par defaut, la règle affiche jusqu'à 100ns
    Via le wizard, on entre une valeur inferieure ou superieure et celle-ci est transmise à l'élement rule que j'ai crée dans ma classe principale :
    FenêtreSimulation via une méthode InitComponent()
    Jusque là tout marche, pas de problèmes.

    En revanche, l'élément Rule ne se repaint() pas, ou du moins seulement si je passe une autre fenêtre dessus, tout cela est normal car je n'ai pas invoqué de repaint pour cet élément à l'issu de la modification de la valeur.

    Mon problème, je n'arrive pas à trouver un moyen d'invoquer ce repaint() une fois que j'ai cliqué par exemple sur le bouton "ok" de ma fenêtre wizard.

    J'ai tenté de recréer un élément Rule dans la classe FenetreWizard et de lui imposer un repaint via une méthode actualiserRule (qui est dans la classe Rule) mais ca ne repaint que lorsque je passe sur l'élément en question.

    Une idée, merci ?

  5. #5
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Puisque tu transmets la nouvelle valeur a ton objet Rule, tu peux egalement appeler repaint() dessus non ? Si tu as deja essaye ca (et apparamment c'est le cas), l'as-tu bien fait apres l'actualisation des valeurs ?

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Par défaut
    Alors effectivement, je n'ai peut être pas actualiser les valeurs ? enfin tu entends par la faire un revalidate() ?

    Sinon, je vais essayer d être un peu plus clair sur ce que j'ai essayé de faire pour voir si je m'y suis bien pris.

    J'ai une variable definitionSimuInitiale que je crée en static int dans la classe Rule.

    Via une fenêtre de configuration crée par la classe Wizard, je rentre une nouvelle valeur pour definitionSimuInitiale. Lorsque je clique sur le bouton OK, j'ai crée une action qui sauvegarde la valeur inscrite dans le JTextField en int dans definitionSimuInitiale avec un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rule.definitionSimuInitiale=Integer.parseInt()
    (Désolé si la ligne de code est fausse, je n'ai plus le code sous les yeux et je ne suis plus sur du code pour convertir un string en int, mais cette ligne marche !)
    Ensuite, je voulais donc lancer un repaint de la règle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rule columnView = new Rule();
    objet de la classe Rule qui est crée dans ma classe principale FenetreSimulation.
    Bien sur, dans FenetreWizard, il ne connait pas l'objet columnView et c'est la que je bloque.
    L'idéal ca serait de faire un columnView.repaint() juste après avoir inscrit dans definitionSimuInitiale la nouvelle valeur non ?

    A ce moment la, j'ai pensé à plusieurs solutions:
    rendre l'éléments columnView static pour y acceder facilement, bien que je doute de la propreté de la chose... De plus, il me semble avoir testé et de souvenir ca ne marchait pas du aux propriétés de la classe Rule

    dès lors, j'ai pensé à faire une méthode getValueOfdefinition...() qui me retournerait la valeur de la variable, et comparer l ancienne valeur a la nouvelle. Si elle est différente, mettre à jour la valeur et lancer un repaint sur l element columnView. Cette comparaison ayant lieu dans la classe principale FenetreSimulation qui me permettrait d'acceder directement a columnView. Ce pendant, je ne sais pas trop comment déclencher cette comparaison... En théorie elle doit se lancer lorsqu'on clique su OK de la fenetre wizard. J'ai pensé à créer une variable qui passe à true lorsqu'on clique sur le bouton OK et qui lancerait la comparaison mais à vrai dire, je ne sais meme pas ou placer le code de la comparaison dans la classe principale...
    Enfin j'ai pensé à ca sans le code sous les yeux, peut être une idée me viendra =)

    Avez vous des idées ? Je sais que ce n'est pas la première fois que je me suis retrouvé devant ce type de problème, généralement, j'ai pu contourner celui-ci, mais la je ne vois pas comment.

    Merci pour votre aide !

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Par défaut
    bon, en fait, je m y etais pris comme un pied et en en faisant une static de l element, je le repaint a la perfection =)

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

Discussions similaires

  1. Rendre l'insersion en graphique
    Par mdh12 dans le forum Débuter
    Réponses: 1
    Dernier message: 16/07/2010, 15h55
  2. [XL-2007] Comment extraire un userform de excel et le rendre independant?
    Par eliou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/06/2010, 19h40
  3. rendre invisible une forme graphique
    Par sky88 dans le forum Débuter
    Réponses: 7
    Dernier message: 26/08/2008, 05h19
  4. Rendre independant 2 divs dans un div
    Par GomuSan dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 02/07/2007, 15h10
  5. Réponses: 1
    Dernier message: 26/04/2006, 14h54

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