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 :

Re dimensionner les colonnes d'un JTableModel


Sujet :

Composants Java

  1. #1
    Membre éclairé Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Par défaut Re dimensionner les colonnes d'un JTableModel
    Salut à tous les amis,
    Je viens vers vous pour une aide. Je tente d'appliquer des dimensions à certaines colonnes de ma Jtable alors j'ai tenté de mettre en plce cette procédure :
    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
    private void initFournisseur(){
    			Thread t = new Thread(){
    		public void run(){
    ArrayList<FournisseursMYSQL> list = DAOFournisseurMYSQL.getListFournisseursMYSQL();
    		lister = list;
      	        Table.setModel(new FournisseurTableModel(lister));
    	TableColumnModel tcm = Table.getColumnModel();
    	Table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    	Table.getColumnModel().getColumn(0).setPreferredWidth(27);
    	Table.getColumnModel().getColumn(1).setPreferredWidth(200);
    	Table.getColumnModel().getColumn(2).setPreferredWidth(100);
    	Table.getColumnModel().getColumn(3).setPreferredWidth(90);
    	}
    	};
    			t.start();
    		}
    Ce bout de code fonctionne. Par contre, j'ai fais ceci pour une plus de clarté :
    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
    //here to set and change the column width
    TableColumn column = null;
    for (int i = 0; i < 4; i++){
    column = Table.getColumnModel().getColumn(i);
    column.sizeWidthToFit();
    	if (i == 0){
    column.setPreferredWidth(10);//first column is smaller
    column.setResizable(false);//Allow not resizable
    	}
    	if (i == 1){
    	column.setPreferredWidth(200);//second column is bigger
    	column.setResizable(false);//Allow not resizable
    }
    	if (i == 2){
    	column.setPreferredWidth(10);//third column is smaller
    	column.setResizable(false);//Allow not resizable
    	}
    	if (i == 3){
    	column.setPreferredWidth(75);//fourth column is less bigger
    	column.setResizable(false);//Allow not resizable
    	}
    	else{
    	column.setPreferredWidth(50);
    		}
    	}
    Mais je constate que ça ne fonctionne pas. Avez-vous une explication ?

  2. #2
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 097
    Par défaut Peut-être
    Avez-vous essayé de déplacer le setResizable(false) après la boucle en enlevant chaque ligne qui le concerne à l'intérieur de la boucle ?
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  3. #3
    Membre éclairé Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Par défaut
    Citation Envoyé par pursang Voir le message
    Avez-vous essayé de déplacer le setResizable(false) après la boucle en enlevant chaque ligne qui le concerne à l'intérieur de la boucle ?
    Heu ! J'ai pas très bien compris. J'enlève le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    column.setResizable(false);//Allow not resizable
    de chaque ligne et je met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    à quel niveau dans le code ?

  4. #4
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 097
    Par défaut Peut-être que c'est ça
    En fait, lorsque vous faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Table.getColumnModel().getColumn(0).setPrefferedWidth(x)
    , vous agissez réellement et directement sur la largeur de la colonne de Table.
    Mais si vous faites :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TableColumn column = Table.getColumnModel().getColumn(0)
    , puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    column.setPrefferedSize(x)
    , vous agissez sur column qui est une copie de la colonne de Table. Donc vous ne changez pas la largeur de la colonne de Table, mais celle de sa copie.
    En claire, si dans votre code vous remplacez toutes les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    column.setPrefferedSize(x)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Table.getColumnModel().getColumn(i).setPrefferedSize(x)
    , et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    column.setResizable(false)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Table.getColumnModel().getColumn(i).setResizable(false)
    ce devrait être bon. Du coup, votre objet colonne ne sert plus à rien mais ça devrait fonctionner...
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  5. #5
    Membre éclairé Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Par défaut
    Je ne sais pas si j'ai bien compris, voici ce que j'ai fais :
    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
    TableColumn column = null;
    for (int i = 0; i < 4; i++){
    Table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    column = Table.getColumnModel().getColumn(i);
    if (i == 0){
    Table.getColumnModel().getColumn(i).setPreferredWidth(70);
    Table.getColumnModel().getColumn(i).setResizable(false);}
    if (i == 1){
    Table.getColumnModel().getColumn(i).setPreferredWidth(350);
    Table.getColumnModel().getColumn(i).setResizable(false);}
    if (i == 2){
    Table.getColumnModel().getColumn(i).setPreferredWidth(40);
    Table.getColumnModel().getColumn(i).setResizable(false);}
    if (i == 3){
    Table.getColumnModel().getColumn(i).setPreferredWidth(145);
    Table.getColumnModel().getColumn(i).setResizable(false);
    }
    Merci de bien vouloir jeter un coup d'oeil sur ce bout de code.

  6. #6
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 097
    Par défaut Oui c'est ça
    Vous pouvez encore modifier deux choses. Supprimez les deux lignes suivantes, elles ne servent plus à rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TableColumn column = null;
    column = Table.getColumnModel().getColumn(i);
    et déplacez la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    avant la boucle.
    Et dites moi si ça vous permet d'obtenir ce que vous cherchez, à savoir afficher votre JTable avec des largeurs de colonne imposées et en désactivant la possibilité de les redimensionner manuellement à l'aide de la souris.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  7. #7
    Membre éclairé Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Par défaut
    Citation Envoyé par pursang Voir le message
    Vous pouvez encore modifier deux choses. Supprimez les deux lignes suivantes, elles ne servent plus à rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TableColumn column = null;
    column = Table.getColumnModel().getColumn(i);
    et déplacez la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    avant la boucle.
    Et dites moi si ça vous permet d'obtenir ce que vous cherchez, à savoir afficher votre JTable avec des largeurs de colonne imposées et en désactivant la possibilité de les redimensionner manuellement à l'aide de la souris.
    Merci cher pursang
    en effet ça fonctionne comme avec les modifs que tu m'a conseillé.
    Merci encore et cordialement.

  8. #8
    Membre éclairé Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Par défaut
    J'ai par contre une question à te poser chercher pursang,
    dans le cas où je voudrais centrer une des colonne, comment je procède ?

    Merci encore.

  9. #9
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 097
    Par défaut Il suffit de faire ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            DefaultTableCellRenderer centreur = new DefaultTableCellRenderer();
            centreur.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
            VotreTable.getColumnModel().getColumn(0).setCellRenderer(centreur);
            VotreTable.repaint();
    Ici, le code centre la première colonne du tableau.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  10. #10
    Membre éclairé Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Par défaut
    Merci encore cher camarade
    J'ai par contre essayé de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    centreur.setFont(new Font("Arial", Font.BOLD, 12));
    pour mettre travailler sur la police ça ne marche pas. Eheuu ! je ne comprend pas trop pourquoi

  11. #11
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 097
    Par défaut Poursuivons.
    Si vous n'y voyez pas d'inconvénients, je vais me permettre de vous tutoyer.
    Pour aller plus loin, il est nécessaire de comprendre comment est réalisée (peinte à l'écran) une JTable. Pour ça, il est préférable de commencer par consulter les tutoriels officiels qui l'expliquent très bien, en tout cas mieux que ce que je pourrais t'en dire. Par contre, j'avoue qu'il est préférable de ne pas avoir de problèmes avec l'anglais...
    Mais pour résumer, les modifications des paramètres d'un réalisateur de cellule par défaut sont limités. Si on veut modifier ces paramètres avec une plus grande liberté, ce qui est le cas si on veut modifier la police en l'occurrence, il faut créer son propre réalisateur en sous-classant DefaultTableCellRenderer et en ré-écrivant les méthodes setValue(Object valeur) et getTableCellRendererComponent(JTable table, Object valeur, boolean selectionne, boolean focusActif, int ligneN, int colonneN).
    Voilà ci-dessous un petit exemple complet qui crée une JTable dont la première colonne est centrée, et présente sont contenu avec la police Verdana en corps 14 style Gras Italique :

    La première classe a créer est notre classe réalisateur. crée un dossier et dans ce dernier, crée un fichier RealisateurPersonalise.java dans lequel tu copies le code suivant :

    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
    import javax.swing.JLabel;
    import java.awt.Font;
    import java.awt.Component;
    import javax.swing.JTable;
     
    public class RealisateurPersonalise extends javax.swing.table.DefaultTableCellRenderer {
     
        private final JLabel Lbl_Afficheur = new JLabel();
     
        public RealisateurPersonalise() {
            Lbl_Afficheur.setHorizontalAlignment(JLabel.CENTER);
            Lbl_Afficheur.setFont(new Font("verdana", Font.BOLD | Font.ITALIC, 14));
        }
     
        public void setValue(Object valeur) {
            Lbl_Afficheur.setText(valeur.toString());
            }
     
        public Component getTableCellRendererComponent(JTable table, Object valeur, boolean isSelected, boolean hasFocus, int row, int column) {
            Lbl_Afficheur.setText(valeur.toString());
            return Lbl_Afficheur;
            }
    }
    Dans le même dossier, crée un second fichier nommé testJTable.java et copies-y le code suivant :

    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
    import javax.swing.JFrame;
    import javax.swing.JTable;
    import javax.swing.JScrollPane;
     
     
    public class testJTable extends JFrame {
     
            public testJTable() {
                super("Fenêtre de test");
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setSize(640, 480);
                setLocationRelativeTo(null);
                initialisation();
                }
     
            private void initialisation() {
                JTable tableau = new JTable();
    tableau.setModel(new javax.swing.table.DefaultTableModel(new Object [][] {{"a", "a", null, null},{"a", "a", null, null},{"a", "a", null, null},{"a", "a", null, null}}, new String [] {"Title 1", "Title 2", "Title 3", "Title 4"}));
                RealisateurPersonalise realisateur = new RealisateurPersonalise();
                tableau.getColumnModel().getColumn(0).setCellRenderer(realisateur);
                JScrollPane scroller = new JScrollPane(tableau);
                scroller.setBounds(10, 10, 610, 380);
                setLayout(null);
                add(scroller);
                }
            public static void main(String args[]) {
                testJTable test = new testJTable();
                test.setVisible(true);
                }
            }
    compile, puis exécutes-le.

    Pour aller encore plus loin, je ne peux que t'inviter à consulter ce lien :
    http://download.oracle.com/javase/tu...nts/table.html
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  12. #12
    Membre éclairé Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Par défaut
    Merci cher ami. j'étais moi aussi gêné lorsque tu me vouvoyais .
    En tout cas je te remercie pour ce cours très succincte sur la mise en forme dans le JTable.
    Sans un peu de travail, il n'y a point de plaisir. Je vais chercher à bien comprendre tout ça. J'ai parcontre une préoccupation urgente toujours sur les Jtables mais cette fois-ci dans les valeurs des cellules. Je l'ai posté dans le forum ici.
    Pourrais-tu jeter un coup d'oeil s'il te plaît pour moi.

    Cordialement !

Discussions similaires

  1. Problème pour dimensionner les colonnes d'un ListGrid
    Par lnplnp dans le forum GWT et Vaadin
    Réponses: 2
    Dernier message: 27/12/2012, 12h05
  2. Réponses: 6
    Dernier message: 08/07/2011, 16h22
  3. [Swing]JTable- Dimensionner les colonnes
    Par loutfi dans le forum Composants
    Réponses: 12
    Dernier message: 01/07/2011, 08h50
  4. Toutes les colonnes d'une BDD
    Par mohamed dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/09/2004, 14h12
  5. Réponses: 1
    Dernier message: 29/08/2004, 19h45

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