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 + JTable] Comment ça marche ?


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut [JScrollPane + JTable] Problème de scroll horizontal
    Bonjour,

    J'ai un problème concernant l'utilisation du JScrollPane... J'essaie de mettre une JTable dedans, et le comportement souhaité est que la JTable s'affiche à sa "preferredSize", le JScrollPane fournissant les ascenseurs permettant de visualiser la JTable dans son intégralité...

    Cependant, ce n'est pas ce que j'obtiens : ma JTable prend la place minimale (les titres des colonnes sont illisibles ainsi que le contenu), et mon JScrollPane ne me montre JAMAIS ces fameux ascenseurs (même lors du resize de ma JFrame...).

    Voici mon petit bout de code :
    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
     
    public static void main(String... args) {
            JFrame jf = new JFrame("coucou");
     
            // Construction de mon TableModel
            ...
     
            JTable jt = new JTable(monTableModel);
            JScrollPane js = new JScrollPane();
            js.setViewportView(jt);
            jf.getContentPane().add(js);
            jf.setSize(new Dimension(750,750));
            jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            jf.setVisible(true);
    }
    Que fais-je mal ?

    Merci pour votre aide


    EDIT : après revérification, j'obtiens l'ascenseur vertical, mais j'aurai surtout besoin en fait de l'ascenseur horizontal...

  2. #2
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    en fait, la JTable a des dispositions spéciales avec le JScrollPane pour que certaines choses se fassent automatiquement (mettre le TableHeader dans le ColumnHeader, par exemple). Pour s'en passer, il y a peut-être plus rapide et efficace, mais ceci marche plutôt bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    JTable table = new JTable(createTableModel());
    JPanel p = new JPanel(new BorderLayout());
    p.add(table);
    JScrollPane pane = new JScrollPane(p);
    pane.setColumnHeaderView(table.getTableHeader());
    Remarque : attention si tu personnalises les Border du Viewport, il faut mettre les mêmes (ou d'autres, mais avec les mêmes Insets) au ColumnHeader, sinon les titres et contenus des colonnes seront décalés.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Merci xavlours pour ton aide

    Mais je ne comprends pas ce code...

    Voila ce que j'ai écrit :

    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
        public static void test(){
            JTable jt = new JTable(createTableModel());
     
            JPanel p = new JPanel(new BorderLayout());
            p.add(jt, BorderLayout.CENTER);
     
            JScrollPane js = new JScrollPane();
            js.setColumnHeaderView(jt.getTableHeader());
     
            JFrame jf = new JFrame("coucou");
            jf.getContentPane().add(p);
            jf.setSize(new Dimension(750,750));
            jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            jf.setVisible(true);
        }
    Ce que j'obtiens, c'est une fenetre contenant le contenu seulement de ma JTable (plus le table header), et toujours aucun ascenseur... Je trouve ça logique, puisque le code que tu me donnes, ton jscrollPane, tu ne l'insère nulle part... Donc je pense que tu as fait une petite erreur...

    Cependant, tu as certainement raison, la solution doit avoir un lien avec le table header...

  4. #4
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Citation Envoyé par Claythest
    jf.getContentPane().add(p);
    Il me semble plutôt que c'est toi qui a fait une petite erreur . Ton JScrollPane je sert pas à grand chose si ajoutes le JPanel à la JFrame ...
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  5. #5
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Citation Envoyé par xavlours
    Il me semble plutôt que c'est toi qui a fait une petite erreur . Ton JScrollPane je sert pas à grand chose si ajoutes le JPanel à la JFrame ...

    Tu avais raison en effet... Déjà fatigué à cette heure-ci !?

    Sinon, j'allais justement poster pour donner une autre solution que j'ai fini par trouver sur le net... Donc voici le code qui fonctionne et que tu m'as en fait donné (et que j'avais mal utilisé, désolé d'avoir douté de toi ) :

    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
        public static void test(){
            JTable jt = new JTable(createTableModel());
     
            JPanel p = new JPanel(new BorderLayout());
            p.add(jt, BorderLayout.CENTER);
     
            JScrollPane js = new JScrollPane(p);
            js.setColumnHeaderView(jt.getTableHeader());
     
            JFrame jf = new JFrame("coucou");
            jf.getContentPane().add(js);
            jf.setSize(new Dimension(750,750));
            jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            jf.setVisible(true);
        }
    Et voici le code qui marche aussi (aucune différence sur l'aperçu) :
    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
    public static void test(){
            JTable jt = new JTable(createTableModel());
            jt.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
     
            JPanel p = new JPanel(new BorderLayout());
     
            JScrollPane js = new JScrollPane();
            js.setViewportView(jt);
     
            p.add(js, BorderLayout.CENTER);
     
            JFrame jf = new JFrame("coucou");
            jf.getContentPane().add(p);
            jf.setSize(new Dimension(750,750));
            jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            jf.setVisible(true);
        }
    Il suffisait d'ajouter l'appel à la méthode jt.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); ...

    Voila, merci encore xavlours

  6. #6
    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
    Par contre je ne comprends absolument pas pourquoi tu n'ajoutes pas directement ta JTable dans ton JScrollPane, à quoi sert ce panel intermédiaire si ce n'est à pondre du code inutile et devoir bidouiller pour faire apparaître tes headers

  7. #7
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    J'étais certain qu'une telle méthode existait (setAutoResizeMode) mais je ne la trouvais pas. J'ai bien précisé que le JPanel n'était pas ce qu'il y a de mieux :
    Citation Envoyé par xavlours
    Pour s'en passer, il y a peut-être plus rapide et efficace, mais ceci marche plutôt bien :
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

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

Discussions similaires

  1. [Débutant][JTable] Comment ça marche?
    Par Nasky dans le forum Composants
    Réponses: 7
    Dernier message: 02/08/2005, 15h04
  2. [SYNEDIT] -> Comment ça marche ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 19h11
  3. [JTable] Comment ne pas afficher les titres ?
    Par FabienBxl dans le forum Composants
    Réponses: 3
    Dernier message: 08/10/2003, 15h01
  4. [TP][Turbo Vision] comment ça marche ??
    Par Costello dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 05/08/2003, 00h24
  5. [update][req. imbriquee] Comment ca marche ??
    Par terziann dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/07/2003, 12h51

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