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 :

[JTable] Horizontal ScrollBar


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Par défaut [JTable] Horizontal ScrollBar
    Salut,

    Je vais encore saouler tout le monde avec un problème de ScrollBar et de JTable.
    J'ai déjà cherché à plusieurs endroits mais rien ne me permet de faire ce que je veux.
    En fait j'ai une JTable avec deux colonne:
    - une avec une CheckBox
    - une autre avec une chaine de caractère

    Je voudrais faire une JTable qui ne coupe pas la chaîne de caractère, mais qui affiche une scrollbar à la place. Mais je veux garder le auto_resize pour que la colonne soir redimensionnée si le scrollpane est plus grand que la table.

    Je vous donne mon exemple de départ si ca peut vous aider à comprendre :
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.table.*;
    import java.awt.*;
     
    public class TableDemo extends JPanel {
     
        public TableDemo() {
            super(new GridLayout(1,0));
     
            JTable table = new JTable(new MyTableModel());
            table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            table.setPreferredScrollableViewportSize(new Dimension(500, 70));
     
            TableColumn column = null;
            for (int i = 0; i < 2; i++) {
                column = table.getColumnModel().getColumn(i);
                if (i == 0) {
                	column.setMaxWidth(100);
                	column.setPreferredWidth(50);
                } else {
                	column.setPreferredWidth(50);
                }
            }
     
            JScrollPane scrollPane = new JScrollPane(table);
            scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
            add(scrollPane);
        }
     
        class MyTableModel extends AbstractTableModel {
            private String[] columnNames = {"Available",
                                            "Title"};
            private Object[][] data = {
                {new Boolean(false),"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
                {new Boolean(false),"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"},
                {new Boolean(false),"ccccccccccccc"},
                {new Boolean(false),"dddddddddddddddddddddddddd"},
                {new Boolean(false),"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"}
            };
     
            public int getColumnCount() {
                return columnNames.length;
            }
     
            public int getRowCount() {
                return data.length;
            }
     
            public String getColumnName(int col) {
                return columnNames[col];
            }
     
            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
     
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }
     
            public boolean isCellEditable(int row, int col) {
                if (col > 0) {
                    return false;
                } else {
                    return true;
                }
            }
     
            public void setValueAt(Object value, int row, int col) {
                data[row][col] = value;
                fireTableCellUpdated(row, col);
            }
        }
     
        public static void main(String[] args) {
            //Create and set up the window.
            JFrame frame = new JFrame("TableDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            //Create and set up the content pane.
            TableDemo newContentPane = new TableDemo();
            newContentPane.setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane);
     
            //Display the window.
            frame.pack();
            frame.setSize(400,200);
            frame.setVisible(true);
        }
    }

  2. #2
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut
    en fait tu voudrai faire un scroll qui s'applique sur colonne ? je ne sais pas si c'est possible franchement. Ou alors un scroll sur chque cellule, j'imagine deja le monstre.

    je te souhaite de trouver, a mon avis ce n'est pas trivial

  3. #3
    Membre confirmé Avatar de soulhouf
    Inscrit en
    Août 2005
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 213
    Par défaut
    moi aussi je voulais faire la même chose que toi il y a pas mal de temps mais je n'ai pas trouvé comment faire.
    donc si tu trouves la solution ça m'interesse aussi

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Par défaut
    Le scroll sur une seule colonne pourrait etre bien je n'y avai pas pensé, mais ca doit être encore plus complexe.

    Mais en fait je veux le Scroll sur toute la table mais qu il n apparaisse que quand la colonne du texte devient trop petite.
    C'est à dire avoir une barre de défilement en dessous de la table plutot que les trois petit point annoncant une chaine tronquée.

  5. #5
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut
    Citation Envoyé par barbu0055

    Mais en fait je veux le Scroll sur toute la table mais qu il n apparaisse que quand la colonne du texte devient trop petite.
    C'est à dire avoir une barre de défilement en dessous de la table plutot que les trois petit point annoncant une chaine tronquée.
    si c'est possible en vertical, ca doit bien etre possible en horizontal

    ps : moi aussi ca m'interesse
    pps : tu devrai peut etre mettre un titre plus explicite (a moins que ce ne soit voulu pour ne pas faire fuir les forumeurs..)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 221
    Par défaut
    Quand il y a trop de ligne a ta JTable a tu un JScrollBar Verticale?

    Car dans les applis que j'ai deja fais, il se mets tout seul quand il faut,par contre pour l'horizontal...
    N'ajoute pas d'option pour ton JScrollPane peut etre...
    Essaye!!

    Je dois avoir un truc du genre quelquepart il me semble, je regarde si je retrouve(ancien projet de stage..)

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Par défaut
    La barre verticale ne pose aucun problème.
    Quant à l'option sur le scrollpane, elle ne change strictement rien.

    Citation Envoyé par pierre.cellard
    pps : tu devrai peut etre mettre un titre plus explicite (a moins que ce ne soit voulu pour ne pas faire fuir les forumeurs..)
    Tu as tout compris, je craignais de faire fuir les lecteurs si je rajoutais "Horizontal ScrollBar" dans le titre.
    Des fois il vaut mieux rester un peu vague pour attirer la foule

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Par défaut
    Je pense que je vais faire des heureux. Une recherche appropriée dans Google m'a permis de trouver la solution. (Je le dis toujours : "Google est ton ami )
    Source de la solution ici .

    Exemple de a solution :
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.table.*;
    import java.awt.*;
    import java.awt.geom.Rectangle2D;
     
    public class TableDemo extends JPanel {
        private boolean DEBUG = false;
     
        private int minW = 0;
        public static final int AN_W = 50;
     
        public TableDemo() {
            super(new GridLayout(1,0));
     
            JTable table = new JTable(new MyTableModel()){
            	public boolean getScrollableTracksViewportWidth() {
            		if (autoResizeMode != AUTO_RESIZE_OFF) {
            			if (getParent() instanceof JViewport) {
            				return (((JViewport)getParent()).getWidth() > getPreferredSize().width);
            			}
            		} 
            		return false;
            	}
            };
     
            table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            TableColumn column = null;
            for (int i = 0; i < 2; i++) {
                column = table.getColumnModel().getColumn(i);
     
                if (i == 0) {
                	column.setMaxWidth(AN_W);
                	column.setPreferredWidth(AN_W);
                } else {
                	column.setCellRenderer(new MyCellRenderer());
                }
            }
     
            JScrollPane scrollPane = new JScrollPane(table);
            scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
            add(scrollPane);
        }
     
        class MyTableModel extends AbstractTableModel {
            private String[] columnNames = {"A/N",
                                            "Title"};
            private Object[][] data = {
                {new Boolean(false),"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
                {new Boolean(false),"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"},
                {new Boolean(false),"ccccccccccccc"},
                {new Boolean(false),"dddddddddddddddddddddddddd"},
                {new Boolean(false),"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"}
            };
     
            public int getColumnCount() {
                return columnNames.length;
            }
     
            public int getRowCount() {
                return data.length;
            }
     
            public String getColumnName(int col) {
                return columnNames[col];
            }
     
            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
     
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }
     
            public boolean isCellEditable(int row, int col) {
                if (col > 0) {
                    return false;
                } else {
                    return true;
                }
            }
     
            public void setValueAt(Object value, int row, int col) {
                data[row][col] = value;
                fireTableCellUpdated(row, col);
            }
        }
     
        class MyCellRenderer extends DefaultTableCellRenderer {
        	public Component getTableCellRendererComponent(JTable table, Object value, 
        			boolean isSelected, boolean hasFocus, int row, int column) {
     
        		super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);
     
        		Rectangle2D r = getFontMetrics(getFont()).getStringBounds(getText(), getGraphics());
        		int w = (int)r.getWidth();
     
        		if (AN_W+w > minW) {
        			minW = AN_W + w;
        			table.getColumnModel().getColumn(column).setMinWidth(w+10);
        		}
     
        		return this;
        	}
     
        }
     
        public static void main(String[] args) {
            //Create and set up the window.
            JFrame frame = new JFrame("TableDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            //Create and set up the content pane.
            TableDemo newContentPane = new TableDemo();
            newContentPane.setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane);
     
            //Display the window.
            frame.pack();
            frame.setSize(400,200);
            frame.setVisible(true);
        }
    }

  9. #9
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut
    sacré barbu, bravo je suis pas sur qu j'aurais trouvé !

  10. #10
    Membre confirmé Avatar de soulhouf
    Inscrit en
    Août 2005
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 213
    Par défaut
    moi non plus merci bien

  11. #11
    Invité de passage
    Inscrit en
    Mai 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 1
    Par défaut Je n'arrive toujours pas à fixer la taille de mes colonnes !!!
    Bonjour,

    J'ai essayé de m'inspirer de l'exemple donné en solution par barbu0055, j'ai bo modifier mon code, je n'y arrive tjs pas !!
    Quelqu'un pourrait-il m'aider ?

    Voilà les principales fonctions qui initialise JPanel, JTable et scrollpane !

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    	/**
             * Cette méthode initialise le tableau
             * 
             * @return JTable
             */
    	private JTable getTabTraces() {
    		if (TabTraces == null) {
    			TabTraces = new JTable() {
    				public boolean getScrollableTracksViewportWidth() {
    	        		if (autoResizeMode != AUTO_RESIZE_OFF) {
    	        			if (getParent() instanceof JViewport) {
    	        				return (((JViewport)getParent()).getWidth() > getPreferredSize().width);
    	        			}
    	        		} 
    	        		return false;
    	        	}
    			};
    //			TabTraces.setShowHorizontalLines(true);
    //			TabTraces.setShowVerticalLines(true);
    //			TabTraces.setRowHeight(20);
    //			TabTraces.setGridColor(new Color(255, 255, 255));
    //			TabTraces.setRowSelectionAllowed(true);
    //			TabTraces.setColumnSelectionAllowed(true);
    //			TabTraces.setSelectionBackground(new Color(16, 35, 140));
    //			TabTraces.setSelectionForeground(Color.WHITE);
    			TabTraces
    			.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    			TabTraces.setPreferredScrollableViewportSize(new Dimension(500, 70));
    //			TabTraces
    //			.setFont(new Font("Calibri", Font.LAYOUT_LEFT_TO_RIGHT, 12));
    			TabTraces.addMouseListener(new PopupListener());
    		}
    		return TabTraces;
    	}
     
    	/**
             * Cette méthode initialise le scrollpane.
             * @return JScrollPane
             */
    	public JScrollPane getScrollPane() {
    		if (scrollpane == null) {
    			scrollpane = new JScrollPane(getTabTraces());
    			scrollpane
    			.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    			scrollpane
    			.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
    		}
    		return scrollpane;
    	}
     
    	/**
             * Cette méthode initialise le panel
             * @return JPanel
             */
    	private JPanel getPnlMain() {
    		if (PnlMain == null) {
    			PnlMain = new JPanel(new GridLayout(1,0));
    			PnlMain.add(getScrollPane());
     
    		}
    		return PnlMain;
    	}
    et voilà comment je modifie la taille de mes colonnes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Mise à jour du model de la JTable.
    // je récupère la taille max pour chaque colonne
    TaillesColonnes = monParseur.getTaillesColonnes();
    // je modifie le nom des colonnes
    monTableau.setValueColonnes(monParseur.getNomColonnes());
    // je met a jour tt mon tableau de données
    monTableau.setValueTable(mesTraces.getListeCour());
    // je modifie la taille de mes colonnes
    monTableau.setColumnSize(TaillesColonnes);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void setColumnSize(int [] size) {
    TableColumn colonne = null;
    for(int i =0; i<NomColonnes.length; i++) {
    colonne = maTable.getColumnModel().getColumn(i);
    System.out.println(size[i]);
    colonne.setMaxWidth(100);
    colonne.setMinWidth(size[i]);
    colonne.setPreferredWidth(size[i]);
    		}
    	fireTableStructureChanged();
    	}
    Merci d'avance !
    Fichiers attachés Fichiers attachés

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 46
    Par défaut
    Bonjour,

    Alors pareillement, je n'ai pas tout compris apparemment...

    Concrètement que dois t'on faire pour que la scrollbar horizontale marche normalement?

    Car sur ma JTable la scroll verticale marche bien mais l'horizontale meme si elle apparait ne fonctionne pas resultat ma cellule est "tronquée" et je ne peux pas voir le reste de son contenu...

    Pouvez vous m'éclairer un peu?
    Merci d'avance.

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

Discussions similaires

  1. Empêcher horizontal Scrollbar dans Details page
    Par DaveShot dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 13/10/2009, 13h31
  2. JTable avec scrollBar
    Par AliJava dans le forum Composants
    Réponses: 3
    Dernier message: 28/04/2008, 16h21
  3. [JTable] Les scrollbars ne fonctionnentp as
    Par nicdo77 dans le forum Composants
    Réponses: 1
    Dernier message: 17/12/2007, 17h29
  4. probleme jtable et scrollbar
    Par jayjay.f dans le forum Composants
    Réponses: 12
    Dernier message: 14/03/2007, 09h34
  5. [scroll] bloquer la horizontal scrollbar
    Par Husqvarna dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 12/09/2005, 11h57

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