Java JTable setting Column Width
j'ai un JTable dans lequel je fixe 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 très bien, mais quand la table est maximisée, j'obtiens l'espace vide à la droite de la dernière colonne. Est-il possible de redimensionner la dernière colonne jusqu'à la fin de la fenêtre?
j'ai trouvé AUTO_RESIZE_LAST_COLUMN
propriété dans docs mais il ne fonctionne pas.
Edit: JTable
, c'est un JScrollPane
son préféré la taille est définie.
7 réponses
que se passe-t-il si vous appelez setMinWidth(400)
dans la dernière colonne au lieu de de setPreferredWidth(400)
?
Dans la JavaDoc de JTable
, lire la documentation pour doLayout()
très attentivement. Voici quelques morceaux de choix:
lorsque la méthode est appelée à la suite du redimensionnement d'une fenêtre enveloppante, le resizingColumn est null. Cela signifie que le redimensionnement a eu lieu "à l'extérieur" du JTable et le changement - ou "delta" - devrait être distribué à toutes les colonnes, indépendamment de le mode de redimensionnement automatique de ce JTable.
C'est peut-être pour ça que AUTO_RESIZE_LAST_COLUMN
ne vous a pas aidé.
Note: Lorsqu'un JTable ajuste les largeurs des colonnes, il respecte leurs valeurs minimales et maximales absolument.
cela dit que vous pourriez vouloir mettre Min = = Max pour tous mais les dernières colonnes, puis Définir Min = Preferred sur la dernière colonne et soit pas définir Max ou définir une très grande valeur pour Max.
avec JTable.AUTO_RESIZE_OFF
, le tableau ne changera pas la taille de l'une des colonnes pour vous, il prendra votre paramètre préféré. Si c'est votre but d'avoir les colonnes par défaut à votre taille préférée, sauf pour avoir la dernière colonne remplir le reste de la vitre, vous avez l'option d'utiliser le JTable.AUTO_RESIZE_LAST_COLUMN
autoResizeMode, mais il pourrait ê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 vous êtes satisfait que AUTO_RESIZE_LAST_COLUMN
fonctionne en fait, vous pouvez expérimenter avec une combinaison de TableColumn.setMaxWidth()
et TableColumn.setMinWidth()
JTable.AUTO_RESIZE_LAST_COLUMN
est défini comme " lors de toutes les opérations de redimensionnement, appliquer des ajustements à la dernière colonne seulement " ce qui signifie que vous devez définir le autoresizemode à la fin de votre code , sinon setPreferredWidth() n'affectera rien!
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);
utiliser 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 ensuite
table.setColumnWidths(30, 150, 100, 100);
lisant la remarque de Kleopatra (sa deuxième fois, elle a suggéré d'avoir un regard sur javax.swing.JXTable , et maintenant je suis désolé je n'ai pas eu un 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, mettre la largeur de la colonne de la table à la largeur totale de la table actuelle. pour ce faire, j'utilise un tableau global de ints pour la colonne (relative) largeurs):
private int[] columnWidths=null;
j'utilise cette fonction pour régler les largeurs des colonnes de la table:
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;col<nrCols;col++){
int width = 0;
if(columnWidths.length>col){
width=columnWidths[col];
}
totalWidthRequested+=width;
}
//Note: for the not defined columns: use the defaultWidth
if(nrRequestedWidths<nrCols){
log.fine("Setting column widths: nr of columns do not match column widths requested");
totalWidthRequested+=((nrCols-nrRequestedWidths)*defaultWidth);
}
//calculate the scale for the column width
double factor=(double)totalWidth/(double)totalWidthRequested;
for(int col=0;col<nrCols;col++){
int width = defaultWidth;
if(columnWidths.length>col){
//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 du paramétrage des données que j'appelle:
setColumnWidths(this.columnWidths);
et en changeant j'appelle le ComponentListener défini au 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 aussi globale:
private JTable table;
et ici je mets l'auditeur:
scrollPane=new JScrollPane(table);
scrollPane.addComponentListener(this);
fireTableStructureChanged();
sera 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 la colonne redimensionner, tous vos paramètres seront réinitialisés. Cet effet secondaire peut se produire indirectement. F. E. en conséquence du fait que le modèle de données liées est modifié d'une manière telle que cette méthode est appelée, après que les propriétés sont définies.
utilisez ce code. Il a travaillé pour moi. J'ai envisagé 3 colonnes. Changez la valeur de boucle de 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);
}