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

Composants Java Discussion :

Taille d'un JComponent


Sujet :

Composants Java

  1. #1
    Membre expert
    Avatar de Faith's Fall
    Profil pro
    Inscrit en
    avril 2004
    Messages
    1 740
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 1 740
    Points : 3 247
    Points
    3 247
    Par défaut Taille d'un JComponent
    Bonjour,

    Je dois faire un composant personnalisé en utilisant la base d'un JComponent, mon code est pour le moment comme ceci :

    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
    package fr.test.component;
    
    import javax.swing.*;
    import java.awt.*;
    
    public class MonComp extends JComponent {
        public MonComp() {
            super();
            setSize(500,400);
        }
    
        @Override
    protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawString("Hello World", 10, 10);
        }
    }
    Le code est un code exemple mais qui me permettrait de voir le squelette du composant. Cela marche, j'ai aucune erreur à la compilation, mais lorsque je met sur un panel (GUI Form sur intellij), la taille du composant est de 0 en largeur et en longeur. A l'execution le "hello world" de s'affiche pas. La solution que j'ai de trouver est de lui définir la taille en dehors du plugin, mais pas vraiment ce que je cherche.

    J'ai déjà tester le setsize, setpreferedsize, etc rien ne change.

    Quelqu'un sait comment on défini une taille dans le composant ?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    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
    Points : 23 015
    Points
    23 015
    Billets dans le blog
    1
    Par défaut
    Salut,


    La taille d'un composant est déterminé par le layout du composant dans lequel du l'ajoutes.
    Cette taille peut varier selon le layout et/ou les preferred/minimum/maximum Size...


    Donc la première question à se poser est : quel est ce layout ?


    a++

  3. #3
    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 : 42
    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 794
    Points
    48 794
    Par défaut
    Tu dois implémenter getPrefered minimum et maximumSize sur ton composant, c'est ce qu'utilise le Layoutmanager pour le dimensionner.

  4. #4
    Membre expert
    Avatar de Faith's Fall
    Profil pro
    Inscrit en
    avril 2004
    Messages
    1 740
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 1 740
    Points : 3 247
    Points
    3 247
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    La taille d'un composant est déterminé par le layout du composant dans lequel du l'ajoutes.
    Cette taille peut varier selon le layout et/ou les preferred/minimum/maximum Size...


    Donc la première question à se poser est : quel est ce layout ?


    a++
    A la base c'est un GridLayoutManager. J'ai tester sur un panel qui a un FlowLayout et meme problème, le composant fait en dimension 0 sur la largeur et longueur.

  5. #5
    Membre expert
    Avatar de Faith's Fall
    Profil pro
    Inscrit en
    avril 2004
    Messages
    1 740
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 1 740
    Points : 3 247
    Points
    3 247
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Tu dois implémenter getPrefered minimum et maximumSize sur ton composant, c'est ce qu'utilise le Layoutmanager pour le dimensionner.
    Je vais tester.

    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
    package fr.test.component;
    import javax.swing.*;
    import java.awt.*;
     
    public class MonComp extends JComponent {
        public MonComp() {
            super();
            setSize(500,400);
        }
     
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawString("Hello World", 10, 10);
        }
     
        @Override
        public Dimension getPreferredSize() {
            return super.getPreferredSize();
        }
     
        @Override
        public Dimension getMinimumSize() {
            return super.getMinimumSize();
        }
     
        @Override
        public Dimension getMaximumSize() {
            return super.getMaximumSize();
        }
    }
    Et si je remplace par une taille précise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(500,500);
    }
     
    @Override
    public Dimension getMinimumSize() {
        return new Dimension(200,200);
    }
     
    @Override
    public Dimension getMaximumSize() {
        return new Dimension(1000,1000);
    }
    Pareil, aucun changement Je m'y prend peut etre mal.

    Je sais pas si cela peut aider, quand je l'agrandis sur le panel le contenu du composant (hello world) est bien présent, mais en relachant il revient a la taille 0

  6. #6
    Expert éminent sénior
    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
    Points : 23 015
    Points
    23 015
    Billets dans le blog
    1
    Par défaut
    Dans ce cas c'est la taille d'un des composants parent qui est restreinte...

    Il faudrait plus de détail sur la création de ton UI.
    Avec un code minimal qui reproduit le problème...

    a++

  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 : 42
    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 794
    Points
    48 794
    Par défaut
    Tu peux montrer le code qui utilise ge composant?

  8. #8
    Membre expert
    Avatar de Faith's Fall
    Profil pro
    Inscrit en
    avril 2004
    Messages
    1 740
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 1 740
    Points : 3 247
    Points
    3 247
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Dans ce cas c'est la taille d'un des composants parent qui est restreinte...

    Il faudrait plus de détail sur la création de ton UI.
    Avec un code minimal qui reproduit le problème...

    a++
    Citation Envoyé par tchize_ Voir le message
    Tu peux montrer le code qui utilise ge composant?

    J'utilise GUI Form d'intellij pour la creation graphique, le code de la fenetre est:

    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
    package fr.test.ui;
    import fr.test.component.MonComp;
     
    import javax.swing.*;
     
    public class Hello {
        private JFrame Frame;
        private JPanel PanRoot;
        private MonComp moncomp;
     
     
        public Hello() {
            this.Frame = new JFrame("Hello world");
            this.Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.Frame.setContentPane(this.PanRoot);
            this.Frame.setSize(1280,720);
            this.Frame.setLocationRelativeTo(null);
     
        }
     
        public void setVisible(boolean b) {
            this.Frame.setVisible(b);
        }
    }
    Pas sur que cela vous aide, tous les composants mis sur GUI Form sont sur PanRoot (un JPanel) et je n'ai aucun moyen de voir le code généré. D'ailleur quand je part sur un JButton, JTextField ou JEditorPane au lieu d'un JComponent, je n'ai aucun soucis de taille. Sinon le code du composant est le même que celui au dessus :

    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
    package fr.test.component;
    import javax.swing.*;
    import java.awt.*;
     
    public class MonComp extends JComponent {
        public MonComp() {
            super();
            super.setSize(500,500);
        }
     
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawString("Hello World", 10, 10);
        }
     
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(500,500);
        }
     
        @Override
        public Dimension getMinimumSize() {
            return new Dimension(200,200);
        }
     
        @Override
        public Dimension getMaximumSize() {
            return new Dimension(1000,1000);
        }
    }
    Pour finir j'appelle la fenetre par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Hello helloform = new Hello();
    helloform.setVisible(true);
    Bon ceci dit le getPreferredSize getMinimalSize etc semble fonctionner a l’exécution de la form. Donc j'avance un peu :p

  9. #9
    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 : 42
    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 794
    Points
    48 794
    Par défaut
    Je ne sais pas comment fonctionne intelliJ, mais ce code est complètement erroné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            this.Frame.setContentPane(this.PanRoot);
    comme PanRoot est null, ceci crée un contenu null dans la JFrame (-> NullPointerException?)

    et ton composant perso n'est utilisé nulle part.

    Commence comme ceci (j'en profite pour corriger les conventions de nommage):

    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
    package fr.test.ui;
    import fr.test.component.MonComp;
     
    import javax.swing.*;
     
    public class Hello {
        private JFrame frame;
        private MonComp moncomp;
     
     
        public Hello() {
            this.frame = new JFrame("Hello world");
            this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.frame.setSize(1280,720);
            this.frame.setLocationRelativeTo(null);
            this.frame.getContentPane().add(new MonComp());
     
        }
     
        public void setVisible(boolean b) {
            this.Frame.setVisible(b);
        }
    }

  10. #10
    Membre expert
    Avatar de Faith's Fall
    Profil pro
    Inscrit en
    avril 2004
    Messages
    1 740
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 1 740
    Points : 3 247
    Points
    3 247
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Je ne sais pas comment fonctionne intelliJ, mais ce code est complètement erroné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            this.Frame.setContentPane(this.PanRoot);
    comme PanRoot est null, ceci crée un contenu null dans la JFrame (-> NullPointerException?)

    et ton composant perso n'est utilisé nulle part.

    Commence comme ceci (j'en profite pour corriger les conventions de nommage):

    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
    package fr.test.ui;
    import fr.test.component.MonComp;
     
    import javax.swing.*;
     
    public class Hello {
        private JFrame frame;
        private MonComp moncomp;
     
     
        public Hello() {
            this.frame = new JFrame("Hello world");
            this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.frame.setSize(1280,720);
            this.frame.setLocationRelativeTo(null);
            this.frame.getContentPane().add(new MonComp());
     
        }
     
        public void setVisible(boolean b) {
            this.Frame.setVisible(b);
        }
    }
    Selon le code oui PanRoot semble null, mais ce n'est pas le cas, le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Frame.setContentPane(this.PanRoot);
    Ce code met le contenu du panel PanRoot dans la Frame. Le PanRoot est géré automatiquement par IntelliJ, du moins pour l'initialisation des composants (et je regrette sincèrement que j'ai pas acces a ce code), sans ce code, tout les composants mis sur ce PanRoot ne serais pas pris en compte à l'execution. C'est pareil, si je met un bouton (JButton) sur le panel et que je le nomme "monbouton" dans le code il va avoir uniquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private JButton monbouton
    Dans le source, je peut bien sur modifier des paramètres et rajouter des actions listeners sur le bouton, mais il y a pas de ligne du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private JButton monbouton = new JButton("Click");
    Apparemment tout ce fait en interne.

    Ton code semble fonctionnelle, mais vire le panel créer par GUI Form d'IntelliJ, ce qui est pas vraiment ce que je cherche

    En tout cas merci pour votre aide , je continu a chercher de mon coté, c'est peut etre un problème spécifique a cette fonctionnalité d'IntelliJ.

  11. #11
    Expert éminent sénior
    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
    Points : 23 015
    Points
    23 015
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Faith's Fall Voir le message
    Bon ceci dit le getPreferredSize getMinimalSize etc semble fonctionner a l’exécution de la form. Donc j'avance un peu :p
    Le problème survient seulement dans l'éditeur ? C'est sûrement qu'il te faut créer un ComponentUI spécifique pour qu'il s'affiche bien.

    Déjà essayes d'appeler setPreferredSize() et autres dans le constructeur au lieu de redéfinir getPreferredSize().


    a++

  12. #12
    Membre expert
    Avatar de Faith's Fall
    Profil pro
    Inscrit en
    avril 2004
    Messages
    1 740
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 1 740
    Points : 3 247
    Points
    3 247
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Le problème survient seulement dans l'éditeur ? C'est sûrement qu'il te faut créer un ComponentUI spécifique pour qu'il s'affiche bien.

    Déjà essayes d'appeler setPreferredSize() et autres dans le constructeur au lieu de redéfinir getPreferredSize().


    a++
    Déjà testé setPreferredSize et autres dans le constructeur (avec et sans la redéfinition des getPreferredSize, etc) et cela ne change rien. Et oui le problème viens uniquement dans l'éditeur. Depuis la solution de tchize_ , à savoir reécrire les valeur de GetPreferredSize getMinimumSize et getMaximumSize, ça marche plutôt bien a l’exécution.

    Par contre tu peut m'en dire un peu plus sur ComponentUI ?

  13. #13
    Expert éminent sénior
    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
    Points : 23 015
    Points
    23 015
    Billets dans le blog
    1
    Par défaut
    Les ComponentUI permettent de détacher certains éléments du composant, notamment pour gérer les Look&Feels...
    Grosso-modo il faut associer une classe qui étend ComponentUI à ton composant, et qui effectuera une partie du travail.

    Mais en fait le "problème" vient plutôt du GUI-designer d'IntelliJ. Il faudrait savoir comment celui-ci fonctionne...


    a++

  14. #14
    Membre expert
    Avatar de Faith's Fall
    Profil pro
    Inscrit en
    avril 2004
    Messages
    1 740
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 1 740
    Points : 3 247
    Points
    3 247
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Les ComponentUI permettent de détacher certains éléments du composant, notamment pour gérer les Look&Feels...
    Grosso-modo il faut associer une classe qui étend ComponentUI à ton composant, et qui effectuera une partie du travail.

    Mais en fait le "problème" vient plutôt du GUI-designer d'IntelliJ. Il faudrait savoir comment celui-ci fonctionne...


    a++
    Ok merci, je vais voir si je trouve des infos en relation avec ce GUI Form, au pire ca fera l'affaire si cela marche en execution, mais je doute qu'il faut aller si loin pour faire un composant personnalisé, surtout ce que je cherche à faire est assez standard. Bref je continu mes recherches, merci encore

Discussions similaires

  1. [Swing] Récupération de la taille d'un JComponent
    Par dingoth dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 04/04/2006, 15h44
  2. Connaitre la taille de la RAM
    Par dway dans le forum Assembleur
    Réponses: 23
    Dernier message: 15/09/2004, 11h05
  3. taille maximale d'une base de donnée paradox
    Par Anonymous dans le forum Paradox
    Réponses: 5
    Dernier message: 14/02/2004, 18h39
  4. taille du texte dans un viewport
    Par pitounette dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/07/2002, 13h06
  5. comment réduire une image jpeg (taille x*y)
    Par don-diego dans le forum C
    Réponses: 4
    Dernier message: 14/07/2002, 21h06

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