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 :

JScrollPane redimensionnement par rapport à son composant JTable


Sujet :

Composants Java

  1. #1
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut JScrollPane redimensionnement par rapport à son composant JTable
    Bonjour,

    Ca fait une semaine que je planche dessus et impossible de trouver une solution. Je vous expose mon problème.

    J'ai une JTable dans un JScrollPane. Lors du "paint" (dans l'UI) de la JTable, je redimensionne les colonnes de la JTable pour qu'il soit de la taille de chaque header des colonnes.
    Mon problème est que ce faisant, la JTable est redimensionné mais le JScrollPane est toujours à sa taille originel (prendre tout l'espace) et donc la scrollbar n'est plus "collé" à la JTable.
    Moi ce que je veux, c'est que le JScrollPane ait la même largeur que la JTable après redimensionnement (enfin plus la taille du JScrollBar)

    J'ai tenté de redimensionner le JScrollPane lors du redimensionnement de la JTable (via un PropertyChangeListener) mais ça ne fonctionne pas. Les valeurs ont beau être les même, il n'y a aucun impact au visuel (même en faisant repaint() ou updateUI()).
    J'ai beau changer les valeurs via le &setSize, le setPreferredSize ou même encore le viewport Size et preferredSize, aucune de ces solutions ne marchent.
    Je vois plus du tout comment faire pour que ma JScrollPane prenne la taille de la JTable.

    Est-ce que quelqu'un aurait une idée? Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 31
    Par défaut
    N'y a t'il pas moyen de redimensionner les colonnes de ta JTable avant le paint() ?
    A mon avis, ton problème viens de là : lors de l'appel à cette fonction, c'est trop tard ...

  3. #3
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    Le problème de le faire avant le paint() est que mon header est composé de JComponent (et non simplement de String) et qu'avant le paint, on ne connait pas la taille de ces JComponent. Donc, je ne peux pas redimensionner ma JTable avant le paint.

  4. #4
    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
    En fait que cherches tu à afficher dans ton header?

  5. #5
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    alors dans mes headers, il peut y avoir des JComponent de type : JCheckBox, JLabel, JButton
    L'affichage de ces composants ne posent pas de problème (j'utilise un renderer et le setHeaderValue).

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 31
    Par défaut
    Citation Envoyé par Tiitiix Voir le message
    avant le paint, on ne connait pas la taille de ces JComponent.
    La méthode paint() fait donc le calcul de la taille de ces composants. Ne peux tu pas le reproduire ?

  7. #7
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    La méthode paint() de mon UI fait appel au paintComponent du renderer de Swing de base et c'est lui qui fait tout le travail de calcul/affichage (si je ne me trompe pas).

    Puis, je trouve que calquer le code déjà fait serait un peu crade non?

    Je pense qu'il doit y avoir un moyen plus propre pour que lorsqu'à l'affichage de ma table, le JScrollPane prenne la taille de son composant, non?

    J'ai pas trouvé de propriété dans le JScrollPane pour faire ça.

    En fait, j'ai réussi à faire ce que je voulais, mais à chaque fois qu'avec ma souris j'entre et sors de la zone du ScrollPane il se dessine/redessine de "taille max" à "taille de la table" ce qui est assez embêtant j'avouerais. Mais pour cela, il faut qu'à chaque paint, il recalcule la taille de la table et adapte la taille du ScrollPane (malgré la définition du setPreferredSize et des autres Size possible).
    Dans ma solution qu'il me faudrait à la fin (c'est-à-dire, un seul appel au calcul de la taille de la table et que le ScrollPanel prenne cette taille une fois pour toute), le ScrollPanel ne se redimensionne absolument pas.

    J'avoue je suis perdue là. Je vois pas pourquoi dans mon premier essai, il se redessine comme je veux/comme je veux pas. Et je vois pas pourquoi si le calcul ne se fait qu'une fois, il se dessine pas comme il faut.

  8. #8
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Essayes de regarder du coté du getPreferredScrollableViewportSize(). C'est peut-être une piste


    a++

  9. #9
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    J'ai essayé ta méthode, lors de mon calcul de la taille de la Table, avec ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    header.getTable().setPreferredScrollableViewportSize(new Dimension(header.getPreferredSize().width, header.getTable()
                .getPreferredScrollableViewportSize().height));
    header.getTable().repaint();
    (parce que je ne veux modifier que la largeur)

    Mais ça ne fonctionne pas. A moins que je fasse la chose mal...

    En tout cas merci à vous de tenter de m'aider.

  10. #10
    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
    La taille n'est pas calculée dans le paint pour moi. C'est le recalcul de la taille qui déclenche le ou les repaint.

    Si tu veux savoir si ton composant a été redimensionnée et quelles sont les nouvelles tailles, diriges toi plutôt vers un ComponentListener.

    D'autant plus que déclencher un repaint dans le paint est une source de boucle infinie.

  11. #11
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    +1 tout ceci n'a rien à faire dans le paint() / paintComponent() (je n'avais pas fait attention à cela).

    Le paintComponent() doit uniquement se contenter de dessiner le composant, et puis basta. Tout le reste doit être fait en dehors.

    a++

    [edit] De plus après un test rapide ton code semble fonctionner normalement :
    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
            String[] names = { "A", "B", "C" };
            Object[][] data = new Object[50][];
            for (int i=0; i<data.length; i++) {
                data[i] = new Object[] { i, i*2, i*9 };
            }
     
            JTable table = new JTable(data, names);
            JScrollPane scrollPane = new JScrollPane(table);
     
     
            table.setPreferredScrollableViewportSize(new Dimension(
                    table.getTableHeader().getPreferredSize().width,
                    table.getPreferredScrollableViewportSize().height));
     
            JOptionPane.showMessageDialog(null, scrollPane);

  12. #12
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    La taille n'est pas calculée dans le paint pour moi. C'est le recalcul de la taille qui déclenche le ou les repaint.
    Ok. Pour moi, lorsque Swing fait le paint d'un composant, ce n'est qu'à ce moment-là que la taille du composant est accessible (avant elle est à 0), non ?

    @adiGuba, merci je vais voir ce bout de code.

  13. #13
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Tiitiix Voir le message
    Ok. Pour moi, lorsque Swing fait le paint d'un composant, ce n'est qu'à ce moment-là que la taille du composant est accessible (avant elle est à 0), non ?
    Lorsque tu crées un composant sa taille est à zéro et c'est normal car ce n'est pas à lui de déterminer sa taille. C'est le rôle du Layout du composant dans lequel il sera inséré. En général ceci est déterminé selon plusieurs critères, en se basant sur les Preferred/Minimum/Maximum size.

    Le JScrollPane (en fait plus particulièrement son ViewPort) utilise un Layout plus complexe qui utilisera les informations renvoyé par les méthode de l'interface Scrollable si le composant fils implémente bien cette interface...


    a++

  14. #14
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    Ok je vais voir ce que je peux faire avec ton explication. Merci beaucoup.

  15. #15
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    Finalement, j'ai bougé le resize dans la classe héritant de JTable qui fait le traitement juste avant le paint et je définis également le maximum, minimum et preferred size du viewport à la même taille.
    Et ça marche, enfin, selon le layout utilisé. Avec un GridBagLayout ça marche bien mais un BorderLayout non (la barre peut se coller mal à la Table).

Discussions similaires

  1. [XL-2003] Imprimer une feuille par rapport à son nom
    Par pingoui dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/03/2010, 23h00
  2. Réponses: 1
    Dernier message: 04/12/2008, 12h43
  3. Positionnement d'un DIV par rapport à son conteneur
    Par vodnok dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 16/01/2008, 13h30
  4. JDialog "Autosize" par rapport à son contenu
    Par Neilos dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 24/10/2007, 08h15
  5. Réponses: 2
    Dernier message: 04/10/2006, 09h22

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