Paramètre Java JTable Column Width

J’ai un JTable dans lequel je règle la taille de la colonne comme suit:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); table.getColumnModel().getColumn(0).setPreferredWidth(27); table.getColumnModel().getColumn(1).setPreferredWidth(120); table.getColumnModel().getColumn(2).setPreferredWidth(100); table.getColumnModel().getColumn(3).setPreferredWidth(90); table.getColumnModel().getColumn(4).setPreferredWidth(90); table.getColumnModel().getColumn(6).setPreferredWidth(120); table.getColumnModel().getColumn(7).setPreferredWidth(100); table.getColumnModel().getColumn(8).setPreferredWidth(95); table.getColumnModel().getColumn(9).setPreferredWidth(40); table.getColumnModel().getColumn(10).setPreferredWidth(400); 

Cela fonctionne bien, mais lorsque la table est agrandie, j’obtiens un espace vide à droite de la dernière colonne. Est-il possible de redimensionner la dernière colonne à la fin de la fenêtre lors du redimensionnement?

J’ai trouvé la propriété AUTO_RESIZE_LAST_COLUMN dans docs mais cela ne fonctionne pas.

Edit: JTable est dans un JScrollPane sa taille préférée est définie.

Que se passe-t-il si vous appelez setMinWidth(400) sur la dernière colonne au lieu de setPreferredWidth(400) ?

Dans le JavaDoc pour JTable , lisez très attentivement les documents de doLayout() . Voici quelques bits de choix:

Lorsque la méthode est appelée à la suite du redimensionnement d’une fenêtre englobante, la propriété ResizingColumn est nulle. Cela signifie que le redimensionnement a eu lieu “hors” de la JTable et que le changement – ou “delta” – doit être dissortingbué à toutes les colonnes, quel que soit le mode de redimensionnement automatique de cette JTable.

C’est peut-être pourquoi AUTO_RESIZE_LAST_COLUMN ne vous a pas aidé.

Remarque: Lorsqu’un JTable apporte des ajustements aux largeurs des colonnes, il respecte absolument leurs valeurs minimales et maximales.

Cela signifie que vous pouvez définir Min == Max pour toutes les colonnes sauf les dernières, puis définir Min = Preferred sur la dernière colonne et ne pas définir Max ou définir une valeur très élevée pour Max.

Avec JTable.AUTO_RESIZE_OFF , la table ne changera pas la taille des colonnes pour vous, elle prendra donc votre paramètre préféré. Si vous souhaitez que les colonnes aient la taille par défaut, sauf pour que la dernière colonne remplisse le rest du volet, vous avez la possibilité d’utiliser le mode JTable.AUTO_RESIZE_LAST_COLUMN JTable.AUTO_RESIZE_LAST_COLUMN, mais il peut être plus efficace lorsqu’il est utilisé avec TableColumn.setMaxWidth() au lieu de TableColumn.setPreferredWidth () pour toutes les colonnes sauf la dernière.

Une fois que vous êtes convaincu que AUTO_RESIZE_LAST_COLUMN fonctionne, vous pouvez expérimenter une combinaison de TableColumn.setMaxWidth() et TableColumn.setMinWidth()

JTable.AUTO_RESIZE_LAST_COLUMN est défini comme “Pendant toutes les opérations de redimensionnement, appliquez les ajustements à la dernière colonne uniquement”, ce qui signifie que vous devez définir le code d’autorisation à la fin de votre code , sinon setPreferredWidth ()

Donc, dans votre cas, ce serait la bonne façon:

 table.getColumnModel().getColumn(0).setPreferredWidth(27); table.getColumnModel().getColumn(1).setPreferredWidth(120); table.getColumnModel().getColumn(2).setPreferredWidth(100); table.getColumnModel().getColumn(3).setPreferredWidth(90); table.getColumnModel().getColumn(4).setPreferredWidth(90); table.getColumnModel().getColumn(6).setPreferredWidth(120); table.getColumnModel().getColumn(7).setPreferredWidth(100); table.getColumnModel().getColumn(8).setPreferredWidth(95); table.getColumnModel().getColumn(9).setPreferredWidth(40); table.getColumnModel().getColumn(10).setPreferredWidth(400); table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); 

Utilisez cette méthode

 public static void setColumnWidths(JTable table, int... widths) { TableColumnModel columnModel = table.getColumnModel(); for (int i = 0; i < widths.length; i++) { if (i < columnModel.getColumnCount()) { columnModel.getColumn(i).setMaxWidth(widths[i]); } else break; } 

Ou étendre la classe JTable :

 public class Table extends JTable { public void setColumnWidths(int... widths) { for (int i = 0; i < widths.length; i++) { if (i < columnModel.getColumnCount()) { columnModel.getColumn(i).setMaxWidth(widths[i]); } else break; } } } 

Et alors

 table.setColumnWidths(30, 150, 100, 100); 

En lisant la remarque de Kleopatra (sa deuxième fois, elle a suggéré de jeter un oeil à javax.swing.JXTable , et maintenant je suis désolé, je n’ai pas regardé la première fois :)) Je vous suggère de suivre le lien

J’ai eu cette solution pour le même problème: (mais je vous suggère de suivre le lien ci-dessus) Sur redimensionner la table, redimensionnez les largeurs de colonne de la table à la largeur totale de la table actuelle. pour ce faire, j’utilise un tableau global d’ints pour les largeurs de colonne (relatives):

 private int[] columnWidths=null; 

J’utilise cette fonction pour définir les largeurs de colonne du tableau:

 public void setColumnWidths(int[] widths){ int nrCols=table.getModel().getColumnCount(); if(nrCols==0||widths==null){ return; } this.columnWidths=widths.clone(); //current width of the table: int totalWidth=table.getWidth(); int totalWidthRequested=0; int nrRequestedWidths=columnWidths.length; int defaultWidth=(int)Math.floor((double)totalWidth/(double)nrCols); for(int col=0;colcol){ width=columnWidths[col]; } totalWidthRequested+=width; } //Note: for the not defined columns: use the defaultWidth if(nrRequestedWidthscol){ //scale the requested width to the current table width width=(int)Math.floor(factor*(double)columnWidths[col]); } table.getColumnModel().getColumn(col).setPreferredWidth(width); table.getColumnModel().getColumn(col).setWidth(width); } } 

Lors de la définition des données, j’appelle:

  setColumnWidths(this.columnWidths); 

et en changeant j’appelle l’ensemble ComponentListener sur le parent de la table (dans mon cas, le JScrollPane qui est le conteneur de ma table):

 public void componentResized(ComponentEvent componentEvent) { this.setColumnWidths(this.columnWidths); } 

notez que la table JTable est également globale:

 private JTable table; 

Et voici que je mets l’auditeur:

  scrollPane=new JScrollPane(table); scrollPane.addComponentListener(this); 
 fireTableStructureChanged(); 

va par défaut le comportement de redimensionnement ! Si cette méthode est appelée quelque part dans votre code APRÈS que vous ayez défini les propriétés de redimensionnement de la colonne, tous vos parameters seront réinitialisés. Cet effet secondaire peut se produire indirectement. Fe comme conséquence de la modification du modèle de données lié de la manière dont cette méthode est appelée, une fois les propriétés définies.

Utilisez ce code. Cela a fonctionné pour moi. J’ai considéré pour 3 colonnes. Modifiez la valeur de la boucle pour votre code.

 TableColumn column = null; for (int i = 0; i < 3; i++) { column = table.getColumnModel().getColumn(i); if (i == 0) column.setMaxWidth(10); if (i == 2) column.setMaxWidth(50); }