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 :

espace alloué JComponent


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 24
    Points : 17
    Points
    17
    Par défaut espace alloué JComponent
    Bonjour tout le monde,

    Voilà en fait on me demande de créer une classe fille de JComponent qui aura pour rôle de dessiner un oval tangent à tous les bords de l'espace qui lui sera reservé.
    Deux choses me tracassent :
    - Comment justement connaître à l'avance l'espace alloué pour ce JComponent ? Au début je pensais mettre des champs dans ma classe fille qui représenteraient la largeur, longueur etc... mais dans tous les cas je créée l'objet avant de l'insérer dans un panel donc ce n'est pas la bonne méthode je suppose ? Ai-je tort ?
    - Tracer un oval avec la méthode drawOval(x,y,z,t) ça ok mais comment je gère cette histoire de tangente ?

    Merci d'avance pour votre aide

  2. #2
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Les bounds courantes d'un JComponent sont toujours connues. Par exemple, la méthode getBounds() donnent les coordonnées par rapport à son contenant, et les dimensions.

    Lorsqu'on dessine dans un JComponent, on dessine toujours relativement à ce JComponent : les coordonnées du point situé en haut à gauche sont 0,0 et les dimensions peuvent être obtenues soit par getSize(), soit par getWidth() (pour la largeur) et getHeight() (pour la hauteur).

    A priori (à moins que je me trompe, mathématiquement parlant), un ovale tangent aux bords d'un JComponent, donc tangent aux bords d'un rectangle horizontal/vertical, est une ellipse horizontale/verticale, qui se dessine donc tout simplement comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void paint(Graphics g) {
     
         super.paint(g);
     
     
         g.setColor(Color.BLUE); // par exemple
         g.drawOval( 0, 0, getWidth(), getHeight() ); // ou fillOval pour un ovale plein
     
     
    }
    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.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    D'accord je pensais justement que c'était incorrect d'appeler la méthode getBounds() dans le constructeur de l'objet alors qu'on ne l'a pas encore "placé" dans la fenêtre. Je vais tester tout ça.
    En tout cas merci infiniment pour ton aide rapide et précise !

  4. #4
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Non, je n'ai pas parlé d'appeler getBounds() dans le constructeur.

    Un composant ne peut avoir une taille (et une position) que par 2 moyens :

    • Soit il est placé dans un conteneur qui a un layout manager
      • qui détermine sa position
      • et évalue sa taille
    • Soit il a été placé en position absolue fixe, avec une taille déterminée fixe (par setBounds(), et en ayant retirer le layout manager du conteneur ; en plus, cela peut nécessiter de déterminer la taille du conteneur en fonction des composants contenus, selon qu'il soit lui-même dans un JPanel avec certains layout managers, ou directement dans une JFrame).


    Dans le cas du layout manager, la position va être déterminée par rapport à des règles propres au layout manager utilisé. Et ses dimensions également, en se basant éventuellement sur l'une (ou toute, selon) des informations fournies par le composant lui-même, parmi sa taille préferentielle (setPreferredSize()), sa taille maxi (setMaximumSize()), sa taille mini(setMinimumSize()), mais également par les dimensions que son parent lui donne.

    Tu ne peux pas savoir lors de l'appel de getBounds() dans le constructeur si la taille a déjà été correctement déterminée ou pas. En général, cela ne peut être connu que lorsque le composant est affiché. Comme, au final, il faut une fenêtre pour afficher des composants (JFrame), soit on donne une dimension à la JFrame, et les layout manager vont déterminer les dimensions des composants, soit on appelle pack(), qui fait l'inverse (en fonction des dimensions demandées pour les composants et des règles des layout managers, la taille de la fenêtre est évaluée).

    En bref, soit on dimensionne (et on place) un composant on lui donnant des bounds, soit on laisse le layout manager déterminer ces bounds (et donc on doit donner des preferedSize, maximumSize, et/ou minimumSize, selon le type de layout manager et son fonctionnement).

    EDIT : voici 2 exemples vite faits. Dans le second, tu pourras voir (en redimensionnant la fenêtre) comment influent les dimensions préférentielles que j'ai donné au composant, en fonction du layout manager utilisé (BorderLayout), et de la règle de placement utilisé (tous les ovales ont les mêmes dimensions préférentielles et maxi).
    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
    33
    34
    public class ExemplePositionAbsolue extends JComponent {
     
    	public ExemplePositionAbsolue() {
     
    	}
     
    	@Override
    	public void paint(Graphics g) {
    		super.paint(g);
    		g.setColor(getForeground());
    		Rectangle bounds = getBounds();
    		g.fillOval(0, 0, (int)bounds.getWidth(), (int)bounds.getHeight());
    	}
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Absolue");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JPanel panel = new JPanel();
    		panel.setLayout(null);
    		ExemplePositionAbsolue composant = new ExemplePositionAbsolue();
    		composant.setBounds(25,10,50,70);
    		composant.setForeground(Color.RED);
    		panel.add( composant );
     
     
    		frame.setSize(200, 200);
    		frame.getContentPane().add(panel);
    		frame.setVisible(true);
     
    	}
     
    }
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    public class ExemplePositionLayout extends JComponent {
     
    	public ExemplePositionLayout() {
     
    	}
     
    	@Override
    	public void paint(Graphics g) {
    		super.paint(g);
    		g.setColor(getForeground());
    		Rectangle bounds = getBounds();
    		g.fillOval(0, 0, (int)bounds.getWidth(), (int)bounds.getHeight());
    	}
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Layout Manager");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JPanel panel = new JPanel();
    		panel.setLayout(new BorderLayout());
    		panel.add( createComposant(Color.RED), BorderLayout.CENTER );
    		panel.add( createComposant(Color.BLUE), BorderLayout.NORTH );
    		panel.add( createComposant(Color.YELLOW), BorderLayout.EAST );
    		panel.add( createComposant(Color.GREEN), BorderLayout.SOUTH );
    		panel.add( createComposant(Color.ORANGE), BorderLayout.WEST );
     
     
    		frame.setSize(200, 200);
    		frame.getContentPane().add(panel);
    		frame.setVisible(true);
    	}
     
    	private static Component createComposant(Color couleur) {
    		ExemplePositionAbsolue composant = new ExemplePositionAbsolue();
    		composant.setPreferredSize(new Dimension(50,70));
    		composant.setMaximumSize(new Dimension(100,100));
    		composant.setForeground(couleur);
    		return composant;
    	}
     
    }
    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.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Super merci d'avoir pris le temps pour ces exemples !
    Une dernière question si je peux me permettre, pourquoi quand j'avais défini la couleur de fond d'une certaine couleur (dans le constructeur), la méthode paint() l'enlève ? J'ai essayé de rajouter l'instruction setBackground(Color) après mais rien n'y fait, il faut également passer par les Graphics comme on utilise une méthode paint() ?

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ce n'est pas que la méthode paint() "enlève" la couleur de fond, c'est qu'elle ne l'utilise pas. Dans le cas d'un JPanel, un composant d'UI, un composant (une instance d'une autre classe) d'UI est affecté (comme pour n'importe quel autre composant d'UI, tel que JButton ou JLabel), auquel est délégué le rendu du composant : dans le cadre du look and feel standard, ce composant est BasicPanelUI, qui utilise la propriété background pour remplir le fond du JPanel avec la couleur référencé par cette propriété (enfin pas exactement, BasicPanelUI étend une classe qui fait ça, mais c'est l'idée). Ce qui n'est pas le cas d'un JComponent, qui ne fait rien de base avec cette propriété.
    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.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Dans ce cas là, comme procéder alors ?

  8. #8
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Comme je te l'ai déjà dit : soit étendre JPanel au lieu de JComponent, soit surcharger paint(), éventuellement de façon plus rigoureuse que la version que j'avais mise dans l'autre post :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @Override
    public void paint(Graphics g) {
       if ( isOpaque() ) {
          g.setColor(getBackground());
          g.fillRect(0, 0, getWidth(), getHeight());
       }
       super.paint(g);
    }
    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.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Ok désolé d'avoir été un peu long à la détente, je devrais m'en sortir maintenant. Merci encore.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/03/2015, 12h29
  2. Reduction taille espace alloué
    Par dourd1 dans le forum Administration
    Réponses: 1
    Dernier message: 16/01/2010, 00h44
  3. Espace alloué aux pièces jointes réduit
    Par Auteur dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 11
    Dernier message: 06/10/2008, 14h51
  4. 1Mo d'espace non alloué en début de DD : pourquoi?
    Par honeydew dans le forum Windows Vista
    Réponses: 1
    Dernier message: 29/08/2008, 23h39
  5. Espace disque alloué pour les entiers
    Par stos dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 30/10/2006, 14h17

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