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

AWT/Swing Java Discussion :

[Swing] Dessin " ccomplexe en fond de JPanel


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 53
    Par défaut [Swing] Dessin " ccomplexe en fond de JPanel
    Bonjour,

    Je suis en train de créer des composants "persos" pour mon application. Cette dernière est basée sur la semi-transparence.
    J'arrive sans problème à créer des panneaux semi transparents ayant des coins arrondis en surchargeant la méthode paintComponent des composants Swing.
    Mais j'en suis maintenant à vouloir créer un panneau ayant l'aspect donné dans la pièce jointe...
    Cette fois, la forme est plus compliqué, et le petit onglet doit être cliquable, afin de permettre de replier le panneau.
    Est-il possible de dessiner pareille forme ?

    Merci.
    Anaxa
    Images attachées Images attachées  

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Par défaut
    c'est sans doute faisable.

    Le problème c'est d'avoir une implémentation sexy.

    Dans le genre bricolage, ce qui marche le mieux c'est sans doute d'utiliser un panel en mode BorderLayout, oui GridBagLayout, et dessus tu rajoutes un panel pour l'onglet et un pour le content.

    Ton panel de fond sert de porteur, c'est ton composants façade, et surtout tu desactives l'interception des cliques dedans (j'ai oublié le nom de la méthode), pour que sous l'onglet il n'y est pas d'interception. Tu laisses actifs le panel de l'onglet et du content.

    Il te suffit de faire du dessins pour le fond de l'onglet et du content et le tour est joué.

    La méthode sexy, c'est l'implémentation d'un composant; mais c'est pour les pro.

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 905
    Billets dans le blog
    54
    Par défaut
    C'est une bonne conception que de proceder ainsi, cependant il n'est pas toujours utile de faire trop de sous-composants (ex : dans un JSlider, le bouton n'est pas un objet separe, c'est juste quelque chose de dessine par l'UIDelegate -l'objet responsable de l'apparence et du comportement d'un JSlider).

    Donc, dans un premier temps, tu peux faire simplement ce que tu envisage avec des Shape qui te permettront ainsi de detecter l'endroit ou tu cliques et de dessiner les formes correctes a l'ecran (voir GeneralPath et Area)
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 53
    Par défaut
    Hello Bouye...
    J'ai bien pensé à utiliser les Shape, mais j'ai beau chercher, je ne vois pas trop comment créer une forme aussi complexe !!!

    Anaxa

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 905
    Billets dans le blog
    54
    Par défaut
    Avec GeneralPath et Area justement :

    - GeneralPath (et Path2D, Path2D.Float et Path2D.Double sous Java6+) permet de dessiner des formes arbitraires. Il est egalement possible d'ajouter des formes au dessin en cours (methode append()). moveTo() deplace le curseur vers le points de depart, la methode lineTo() permet de simplement tracer des lignes tandis que curveTo() et quadTo() permettent de tracer des courbes (voir splines de Bezier, splines bicubiques et points de controle). closePath() permet de fermer le chemin en revenant au point de depart avec une ligne droite.

    - Area permet de combiner des formes en elles et d'effectuer des operation plus avancees dessus (ajout, suppression, intersection, xor). Donc on peut contruire une telle forme avec simplement des cercles (Ellipse2D) et des rectangle (Rectangle2D) ou des rectangles arrondis (RoundRectangle2D).

    Le mieux est tout betement de constuire la chose sur papier ou dans un logiciel de dessin (pas forcement vectoriel d'ailleurs, meme les modules de dessin de Word ou Powerpoint devraient suffire pour cette tache) et d'ensuite reporter/adapter les coordonnees en Java2D (nottament dans le cas des points de controle des splines pour GeneralPath) par rapport a la taille du composant (penser au ComponentListener pour redimensionner la forme quand le composant change de taille).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 53
    Par défaut
    Merci pour tes indications !
    J'ai en effet réussi à mettre en place une forme comme je le désirais ! Malheureusement, je n'arrive à tracer proprement que le contour... Lorsque je fait mon :
    seules les zones en curve sont remplies et pas tout mon path...

    Voilà mon code !

    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
     
            g2d.setColor(Color.RED);
     
            Path2D.Double path2D = new Path2D.Double();
            path2D.moveTo(0, 0);
            path2D.lineTo(80, 0);
            path2D.moveTo(80, 0);
            path2D.curveTo(90, 0, 100, 10, 100, 20);
            path2D.moveTo(100, 20);
            path2D.lineTo(100, 100);
            path2D.moveTo(100, 100);
            path2D.curveTo(100, 110, 90, 120, 80, 120);
            path2D.moveTo(80, 120);
            path2D.lineTo(80, 500);
            path2D.moveTo(80, 500);
            path2D.curveTo(80, 520, 60, 540, 40, 540);
            path2D.moveTo(40, 540);
            path2D.lineTo(0, 540);
            path2D.moveTo(0, 540);
            path2D.lineTo(0, 0);
            path2D.closePath();
     
            g2d.draw(path2D);
     
            g2d.setColor(new Color(255,0,0,140));
     
            g2d.fill(path2D);
    Anaxa

Discussions similaires

  1. [SWING][Dessin] Effet de répétition non désiré
    Par Invité dans le forum AWT/Swing
    Réponses: 18
    Dernier message: 11/12/2006, 10h23
  2. Réponses: 7
    Dernier message: 04/06/2006, 17h00
  3. [SWING][GlassPane] comment rendre un fond transparent ?
    Par PoPeio dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 11/04/2006, 01h55
  4. [swing] Dessiner contour d'un composant
    Par issou dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 01/03/2006, 11h57
  5. Réponses: 14
    Dernier message: 13/10/2005, 15h00

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