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 :

Comment obtenir/créer objet Graphics2


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Par défaut Comment obtenir/créer objet Graphics2
    Comment puis-je obtenir/créer un objet Graphics2D avant l'affichage de JPanel pour lequel j'ai redéfini la méthode 'paintComponent(Graphics g)'.
    Dans mon cas je dessine les onglets dans la méthode paintComponent et je voudrais calculer la largeur des onglets en fonction de text que je passe au constructeur de mon JPanel.
    Voici comment j'obtiens et dessine le texte sur l'onglet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private void createTitle(String text, Graphics2D g2d, int x, int y, boolean isSelected) {
            Font font = ...mon font
            Color foreground = ... mon Color
     
            Graphics2D g = g2d;
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g.setPaint(foreground);
            Point loc = new Point(x, y);
            FontRenderContext frc = g.getFontRenderContext();
            TextLayout layout = new TextLayout(text, font, frc);
            System.out.println(text + ": " + layout.getBounds().getWidth());
            layout.draw(g, (float) loc.getX(), (float) loc.getY());
        }
    J'appelle cette méthode à partir de paintComponent dans laquelle je boucle sur mes tabs et les dessine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    for (BaseTabRectangle rectangle : rectList) {
    ...
    createTitle(rectangle.getTitle(), g2d, rectangle.x + 15, rectangle.y + 18, rectangle.equals(selectedTab));
    ...
    }
    j'ai essaye de faire comme ça dans le constructeur de ma calsse qui extends JPanel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Graphics2D g2d = (Graphics2D)this.getGraphics();
    mais à mon avis comme le composant même (ma Panel) n'est pas encore dessinée, alors g2D est toujours Null.
    Quelqu'un a une idée ?
    Merci.

  2. #2
    Membre très actif
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Graphics2D g2d = (Graphics2D)g;

  3. #3
    Membre éclairé Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Par défaut
    Lis plus attentivement ce que j'ai décrit. De cette façon tu ne peux obtenir l'objet Graphics que dans la méthode paintComponent que tu doit override.

  4. #4
    Membre très actif
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Par défaut
    Peux-tu mettre le code complet.

  5. #5
    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
    Le concept c'est que les Graphics n'ont qu'une existence relativement courte. Ils correspondent au contexte graphique du composant sur le matériel présent de l'autre coté. Donc à chaque repaint un nouveau contexte graphique est crée. De fait c'est pourquoi toutes les modifs doivent être réalisée dans le paintComponent.

    La méthode getGraphics ne doit absolument pas être utilisée pour fournir des Graphics destinés à être utilisée pour du dessin.

    De fait si le composant n'est pas affiché, il n'a pas de graphics.

  6. #6
    Membre éclairé Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Par défaut
    je joins Sinok et c'est pour ça que je ne vois pas d'autre solution que tout fair dans paintComonent:
    1. Calculer le width de chaque tab et en prendre la maximale.
    2. Supprimer les tabs de la liste
    3. Rajouter les nouveau tabs avec leurs nouveaux x,y,width, height puisque je dessine chaque tab en fonction de ses coordonnées. (en réalité c'est seulement x qui change).
    4; Redessiner les tabs.

    C'est bien dommage d'être obligé de boucler autant de fois sur la liste des tabs rien que pour ça. Avant je passais juste un String comme libellé de l'onglet, et là c'était facile de calculer la largeur maximale et la setter pour toutes les tabs. Avec Font et tout le bazar qui vient avec - c'est autre chose.

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

Discussions similaires

  1. Comment obtenir le nom d'un objet en clickant dessus?
    Par Dereck07 dans le forum Delphi
    Réponses: 13
    Dernier message: 08/07/2007, 13h40
  2. Réponses: 7
    Dernier message: 30/05/2007, 16h17
  3. Comment Obtenir en JS les infos d'un objet HTML ?
    Par prin-prin dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/12/2005, 16h50
  4. [JVM]Comment obtenir les objets en mémoire ?
    Par ZeKiD dans le forum Général Java
    Réponses: 6
    Dernier message: 15/12/2005, 08h59
  5. Réponses: 17
    Dernier message: 04/04/2005, 17h50

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