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

Agents de placement/Fenêtres Java Discussion :

[debutant] dimensionnement d'une JFrame avec utilisation d'un pack()


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut [debutant] dimensionnement d'une JFrame avec utilisation d'un pack()
    Bonjour,

    Je vais essayer d'etre le plus clair possible.

    J'ai une architecture qui est la suivante : une Jframe qui contient un JPanel, qui contient un JSplitPane qui contient lui meme un JTree et un JEditorPane. (voir piece jointe: composants-JFrame.JPG).

    Quand je lance la JFrame depuis mon application, je voudrais sizer cette Jframe a 1/3 de l'ecran en largeur, et la totalité de l'écran en hauteur.

    J'y arrive assez bien en agissant sur la Jframe par un setSize et un setExtendableSate(MAXIMIZED_VERT). Le probleme c'est que ce qui est contenu par ma Jframe ne s'affiche pas correctement (voir pièce jointe JFrame-overview.JPG) => mon Jpanel ne semble pas etre sizé pour coller à la Jframe...

    Je sais qu'en faisant un JFrame.pack, ma Jframe va calculer les preferredSize de chacun des sous composants, et dans ce cas la, je n'ai plus le probleme de la zone grisée. Malheureusement, quand j'essaye de mettre des preferred size correcte a mes sous-composants, je n'arrive pas a leur donner dynamiquement la bonne taille (qui prend en compte la barre de la fenetre, la barre du menu démarrer en bas, le cadre de la Jframe la largeur du splitPane, etc...)

    Il me semble que ce pb doit etre récurrent, mais je ne trouve ni tuto, ni post qui me permette de résoudre ce pb... Merci d'avance a quiconque peut m'apporter des idées!
    Images attachées Images attachées   

  2. #2
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Je ne suis pas sûr de comprendre...
    La méthode pack() calcule la taille de ta JFrame en fonction des preferredSize des composants qu'elle contient.
    Tu dois donc fixer ces preferredSize en dur.

    Si ce que tu veux faire, c'est calculer ces preferredSize en fonction de la taille de ton écran, tu peux utiliser les méthodes de la classe Toolkit, entre autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Toolkit.getDefaultToolkit().getScreenSize();
    Mais tu dois donc bien calculer la taille de chacun des composants de ta JFrame en fonction de la taille que tu veux que celle-ci ait.
    Si tu sais que tel panel doit faire 1/4 de la hauteur et de la largeur de ta frame qui elle-même doit faire 1/3 de la taille de ton écran, tu dois pouvoir t'en sortir...

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Tu as cerné mon probleme.

    J'ai deja essayé de récupérer la size de l'ecran avec la classe Toolkit, d'en déduire les largeurs et hauteurs voulues pour ma JFrame, et d'initialiser la preferred size de mon Jpanel (contenu dans la JFrame) avec ces valeurs. Puis je fais un JFrame.pack().

    A l'exécution, mon problème de zone grisée est réglé. Par contre, ma fenetre ne respecte pas les dimensions que je pensais etre les bonnes.

    En effet, la fenetre mord sur la barre des taches, et déborde de l'écran a droite.

    Ce doit surement etre parce que je n'ai pas pris en compte le cadre de ma fenetre (par exemple: barre du haut avec la croix pour fermer, le maximize et minimize ).

    Est ce que je dois calculer au pixel pres, en tatonnant, le nombre de pixel a retrancher des valeurs pour les preferred size? ca peut coller sur mon pc, mais quid d'un pc avec une autre résolution?

    Déja, merci d'avoir répondu a ma première question, mais la je ne sais pas comment m'en sortir pour faire qqch de dynamique.

    P.S: j'ai essayé de faire un JFrame.setExtendableState(MAXIMIZED_VERT), mais il semble que ca ne marche pas apres un JFrame.pack()

  4. #4
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Je ne voudrai pas dire de bêtise, mais peut-être faudrait-il que tu récupères la taille du contentPane de ta JFrame. Je m'explique :
    1) affecte la taille de ta JFrame à la dimension souhaitée (/ex : le 1/3 de ta screenSize)
    2) récupère la taille de son contentPane (qui sera dans ce cas, le 1/3 de ta screenSize - tout ce qui est autour du contentPane [en théorie, menuBar, etc])
    3) calcule les taille de tes panels en fonction de la taille de ton contentPane
    4) "pack" ta frame

    Je ne suis pas sûr que ça marche, mais sait-on jamais...

  5. #5
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Je me permets de m'imiscer dans la conversation.

    pack() ajuste les tailles des composants de "bas en haut", c'est à dire que c'est le contenu qui va influer sur la taille du contenant.

    Pour faire l'inverse (adapter les contenus aux contenants), il faut utiliser les bons Layouts. Par exemple il me semble que si tu mets ton JSplitPane dans un BorderLayout (ou un GridLayout(1, 1)), ça devrait le forcer à prendre la taille du contentPane.

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Ben... c'est dommage, ça m'avait l'air d'etre une bonne idée... mais ça marche pas.

    la taille de mon contentPane est complètement, mais alors complètement à l'ouest.

    En meme temps, j'ai jamais utilisé le contentPane... je sais pas si j'ai pas manqué une étape dans mon codage pour que cette solution marche...

  7. #7
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    J'ai fait un rapide test avec un BorderLayout, normalement ya pas de probleme si tu fais un setSize sur la JFrame (sans faire de pack attention !), les composants dans la JFrame s'adapte automatiquement a la taille de la fenetre.

    Peut-etre qu'avec un petit bout de code on comprendrait mieux ton probleme.

    Bulbo

  8. #8
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Bon, je viens d'essayer avec un BorderLayout, et ca ne marche toujours pas, j'ai encore la zone grisée que j'ai décrite plus haut...

    Voici un peu mon code, je ne vois pas quoi montrer d'autre:

    Dans le constructeur de ma JFrame :

    this.getContentPane().setLayout(new BorderLayout());
    this.getContentPane().add(monJPanel, BorderLayout.NORTH);
    --------------

    Dans l'événement clic qui déclenche l'apparition de la Jframe :

    maJframe.setVisible(true);
    maJframe.setEnabled(true);

    this.setSize(largeurFenetrePrincipale/3, longueurFenetrePrincipale);
    --------------

    J'ai aussi ajouté un borderLayout a mon Jpanel pour gérer le splitPane, et j'ai enlevé le pack().

    J'espere avoir fait une erreur dans l'utilisation du borderLayout...

  9. #9
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    J'ai quelques remarques : ta JFrame ne semble contenir que le JSplitPane. Dans ce cas, inutile de passer par un JPanel intermédiaire.
    De plus, si jamais tu ajoutes d'autres composants au contentPane ou au JPanel, c'est normal que tu aies une zone grise. Je t'invite donc à vérifier ceci.

    Ceci devrait marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public maJFrame() {
      super("ma JFrame contient un JSPlitPane");
     
      // Le BorderLayout est mis par défaut, inutile de le préciser
     
      JSplitPane split = new JSplitPane(... vertical);
      // construction et remplissage du splitpane
     
      this.getContentPane().add(split, BorderLayout.CENTER);
     
      setSize(...);
      setVisible(true);
    }

  10. #10
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Yessss!!

    C'est bon, ca marche, c'est trop cool!

    J'ai donc enlevé mon Jpanel. J'ai encore bataillé qques minutes avant de me rendre compte que je faisais mon setSize apres mon setVisible, et ça a de l'importance!

    Merci bien pour votre aide, quand on débute, il y a des fois ou on est perdu entre toutes les possibilités d'utilisation des divers objets, la vous m'avez super bien aiguillé!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/06/2006, 15h49
  2. Redimensionner une JFrame avec valeur limite
    Par ppopov dans le forum Agents de placement/Fenêtres
    Réponses: 11
    Dernier message: 15/01/2006, 20h08
  3. [DEBUTANT] sortir d'une boucle avec un touche particulière
    Par thibouille dans le forum Débuter
    Réponses: 4
    Dernier message: 25/10/2005, 06h44
  4. TForm dans une DLL avec utilisation d'Interface
    Par guedelmalin dans le forum Langage
    Réponses: 13
    Dernier message: 17/06/2005, 11h58
  5. Faire une JFrame avec LookAndFeel
    Par aburner dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 03/12/2003, 08h54

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