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 :

question sur la méthode paint()


Sujet :

2D Java

  1. #1
    Invité
    Invité(e)
    Par défaut question sur la méthode paint()
    Bonjour,

    J'ai un petit soucis qui vous trouverez probablement tout bête, mais je ne suis pas encore d'un niveau très avancé en Java...

    Je souhaite implémenter la méthode paint() pour un conteneur, mais... je n'arrive pas à trouver des mots pour m'expliquer donc voici un exemple très simplifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class MainView extends JFrame {
     
        public MainView() {
            Jpanel p = new JPanel();
            this.add(p);
        }
     
    }
    Dans cet exemple, je ne veux pas que la méthode paint() soit implémentée par l'objet MainView, mais par le JPanel p.
    En gros, je ne veux pas ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class MainView extends JFrame {
     
        public MainView() {
            Jpanel p = new JPanel();
            this.add(p);
        }
     
        public void paint(Graphics g) {
            ...
        }
     
    }
    Le problème est que je ne vois pas comment faire autrement...

    Merci d'avance !

    Axel

  2. #2
    Membre éclairé Avatar de unknow0
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 452
    Points : 676
    Points
    676
    Par défaut
    Bonjour,

    C'ets simple il faut que tu cree une class qui herite de JPanel c'est tout

    et tu devrai (pour faire des dessin dans un JPanel) plutot redefinir la methode paintComponent

    Voila a la prochaine peu etre

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse !
    Quand tu dis créer une classe, je doute que ce soit créer un nouveau fichier. Est-ce que ça doit ressembler à ça :

    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
    public class MainView extends JFrame {
     
        public MainView() {
            Panneau p = new Panneau();
            this.add(p);
        }
     
        class Panneau extends JPanel {
     
            public Panneau() {
                ...
            }
     
            public void paintComponents(Graphics g) {
                ...
            }
     
        }
     
    }
    Edit:
    Je viens de me renseigner un peu. Si j'ai bien compris il s'agit en fait de créer une classe interne ?
    Dernière modification par Invité ; 29/11/2008 à 12h01.

  4. #4
    Invité
    Invité(e)
    Par défaut
    En fait mon idée de base est d'afficher une image dans un JPanel.
    Ce JPanel est à l'intérieur d'un JScrollPane qui lui même, et avec d'autres JScrollPane, se trouve dans une frame.
    Le GUI de Netbeans s'occupe de la mise en page, excepté pour le JPanel.
    Voila ce que ça donne en gros avec une classe interne :

    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
    public class MainView extends FrameView {
     
        public MainView(SingleFrameApplication app) {
            super(app);
     
            initComponents();
     
            pImg = new PanelImg();
            scrollP.add(pImg);
        }
     
        class PanelImg extends JPanel {
            private Image img;
     
            public PanelImg() {
                img = getToolkit().getImage("chemin");
            }
     
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(img, 0, 0, this);
            }
        }
    }
    Malheureusement, ça ne marche pas, l'image ne se charge pas...
    D'où vient le problème ?

    Merci d'avance,
    Axel

    Edit:
    Cela fait plusieurs heures que je tripatouille le code dans tous les sens, mais ça ne marche toujours pas... J'ai essayé en créant une classe dans un autre fichier cette fois-ci et j'ai le même problème. J'ai mis quelques points de tests et c'est comme si le programme ne rentrait jamais dans la méthode paintComponent... Partout ailleurs, j'ai bien un message qui s'affiche dans la console.
    Dernière modification par Invité ; 29/11/2008 à 19h31. Motif: plus d'infos...

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    as-tu vérifié (par exemple en lui mettant une bordure) que ce n'es pas simplement ton JPanel qui est vide. Le mieux est de surcharger, sur panelImg, les méthodes getMaximumsize, get PreferedSize() et getMinimumSize() pour que ca colle avec ton image.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ça y est c'est résolu, en fait j'avais plein de problèmes de partout ! Et à un moment, je devais sûrement avoir un panel vide... La prochaine fois je penserai à mettre une bordure

    Voici les principaux problèmes résolus :
    Déjà, pour ajouter le JPanel au JScrollPane, j'utilisais add alors que la méthode correcte est setViewPortView (un truc comme ca...).
    Ensuite après cet ajout, il a fallu rajouter la ligne getFrame().repaint();
    Enfin, une fois que ça s'est bien affiché, j'ai eu plein de problèmes avec les tailles parce que, je ne sais pas pourquoi, l'image récupérée par le toolkit avait une dimension de {-1, -1}... J'ai donc remplacé la ligne par img = new ImageIcon(chemin).getImage();

    Ouf !

    Entre temps, j'ai donc créer une classe séparée PanelImg.
    Et je me demandais justement quelle était la meilleure solution entre une classe séparée ou une classe interne ?
    Et tchize_, merci pour ta réponse ! Mais tu parles de surcharger certaines méthodes, pourrais-tu m'expliquer à quoi ça sert ?

    Axel

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    si tu ne fait que dessiner dans ton JPanel, comme il ne contient aucun objet, sa taille pourra varier de 0 à l'infini, ce qui n'est pas l'idéal quand on l'utilise comme zone de dessin. Quand on crée un composant qu'on dessine sois meme, on par généralement d'un JComponent, et on surcharge les 3 méthodes taille préférée, taille minimum et taille maximum pour donner des valeur cohérente avec le composant créé.

  8. #8
    Membre éclairé Avatar de unknow0
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 452
    Points : 676
    Points
    676
    Par défaut
    Bonjour,

    axel41> Pour les difference entre une class interne et une class separer, pour ma par je prefer faire une class separer comme ca je peu la reutiliser facillement mais bon si tu es sur de ne pas avoir la reutiliser une class interne convient
    apres c'est selon tes preference

    tchize_> AA ca c'est pas bete au moin ca evite certain bug pas forcement facile a trouver

  9. #9
    Invité
    Invité(e)
    Par défaut
    OK, je vais implémenter tout ça
    Merci beaucoup !

    A bientôt
    Axel

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/03/2009, 13h54
  2. [c#][Question sur la méthode ReadToEnd()]
    Par cescu dans le forum C#
    Réponses: 4
    Dernier message: 17/11/2008, 09h00
  3. Question sur la méthode extends
    Par Djule dans le forum Langage
    Réponses: 4
    Dernier message: 04/02/2007, 16h01
  4. Question sur les méthodes abstraites
    Par nmathon dans le forum Delphi
    Réponses: 3
    Dernier message: 15/06/2006, 20h30
  5. [WebServices][axis] question sur la méthode service()
    Par Nycos62 dans le forum Services Web
    Réponses: 9
    Dernier message: 21/04/2005, 09h32

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