web-dev-qa-db-fra.com

Redimensionnement automatique des largeurs de colonne JTable

J'ai besoin que ma table JTable redimensionne automatiquement la largeur de ses colonnes pour s'adapter au contenu. J'ai trouvé la classe TableColumnAdjuster très utile. Mais il y a un petit problème. Disons que j'ai 5 colonnes et que leur contenu est très court. Dans ce cas, si j'utilise le réglage automatique, il définit les quatre premières largeurs de colonnes en fonction de leur contenu et donne tout le reste d'espace à la dernière colonne. Veuillez voir l'exemple.

enter image description here

Ici, la dernière colonne, Balance reçoit tout l'espace excédentaire. Mais que faire si j'ai besoin de donner cet espace à l'une des colonnes du milieu. Dans le cas ci-dessus, j'ai besoin d'affecter cet espace à la troisième colonne, name. J'ai essayé de modifier la méthode adjustColumns() de la classe TableColumnAdjuster. Mais je ne pouvais pas le faire fonctionner.

J'ai essayé à la fois column.setPreferredWidth() et column.setWidth() pour changer la taille des colonnes. Mais ça ne change rien. Comment puis-je modifier efficacement la taille des colonnes d'un JTable. S'il y a une autre alternative ou une réponse directe à mon problème principal, c'est mieux. Merci!

26
Anubis

Vous pouvez essayer le suivant:

public void resizeColumnWidth(JTable table) {
    final TableColumnModel columnModel = table.getColumnModel();
    for (int column = 0; column < table.getColumnCount(); column++) {
        int width = 15; // Min width
        for (int row = 0; row < table.getRowCount(); row++) {
            TableCellRenderer renderer = table.getCellRenderer(row, column);
            Component comp = table.prepareRenderer(renderer, row, column);
            width = Math.max(comp.getPreferredSize().width +1 , width);
        }
        if(width > 300)
            width=300;
        columnModel.getColumn(column).setPreferredWidth(width);
    }
}

JTable

Cela doit être exécuté avant la méthode de redimensionnement.
Si tu as:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

JTable

57
Paul Vargas

Il n'y a pas d'option pour redimensionner automatiquement une colonne plus grande que l'autre.

Vous pouvez peut-être faire quelque chose comme:

tca = new TableColumnAdjuster( table, 0 );
tca.adjustColumns();
TableColumnModel tcm = table.getColumnModel();  
TableColumn tc = tcm.getColumn(1);
tc.setWidth(tc.getWidth() + 25);

Cela vous permettrait d'ajouter de l'espace supplémentaire à la colonne 1. Cet espace supplémentaire ne serait ajouté que la première fois que le tableau est affiché.

Une autre option consiste à utiliser:

table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);

Cela allouerait de l'espace supplémentaire proportionnellement à chaque colonne.

5
camickr

setAutoResizeMode () dira à votre table comment redimensionner vous devriez essayer toutes les différentes options disponibles pour voir les différences, dans mon cas, je voulais redimensionner spécifiquement deux colonnes et le laisser décider comment ajuster tous les autres.

jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
TableColumnModel colModel=jTable1.getColumnModel();
colModel.getColumn(1).setPreferredWidth(25);    
colModel.getColumn(2).setPreferredWidth(400);
3
Edwin Barahona

Tu peux le faire:

JPanel jp = new JPanel();
jp.add(table);

jp.setLayout(new GridLayout(1,1)); /* little trick ;) and believe me that this step is important to the automatic all columns resize! A import is also needed for using GridLayout*/
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); // this is obvius part
0
augus1990