web-dev-qa-db-fra.com

Paramètre JTable Java Largeur de colonne

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 la documentation, mais cela ne fonctionne pas.

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

84
Hamza Yerlikaya

Que se passe-t-il si vous appelez setMinWidth(400) dans la dernière colonne à la place de setPreferredWidth(400)?

Dans le JavaDoc de JTable, lisez attentivement la documentation de doLayout() . Voici quelques morceaux de choix:

Lorsque la méthode est appelée à la suite du redimensionnement d'une fenêtre englobante, le fichier resizingColumn est null. Cela signifie que le redimensionnement a eu lieu "en dehors" de la JTable et le changement - ou "delta" - devrait être distribué à toutes les colonnes indépendamment de le mode de redimensionnement automatique de cette JTable. 

C'est peut-être pour ça que AUTO_RESIZE_LAST_COLUMN ne vous a pas aidé.

Remarque: lorsqu'une table JT ajuste la largeur des colonnes, elle respecte leur valeurs minimale et maximale absolument. 

Cela signifie que vous pouvez définir Min == Max pour toutes les colonnes sauf la dernière, puis définissez Min = Préféré sur la dernière colonne et ne définissez pas Max ou définissez une valeur très grande pour Max.

41
Eddie

Avec JTable.AUTO_RESIZE_OFF, la table ne changera pas la taille des colonnes pour vous, elle utilisera donc votre paramètre préféré. Si vous souhaitez que la taille par défaut des colonnes corresponde à votre taille préférée, sauf que la dernière colonne remplisse le reste du volet, vous avez la possibilité d'utiliser le JTable.AUTO_RESIZE_LAST_COLUMN autoResizeMode, mais il pourrait s'avérer 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 essayer une combinaison de TableColumn.setMaxWidth() et TableColumn.setMinWidth()

22
akf

JTable.AUTO_RESIZE_LAST_COLUMN est défini comme "Lors de toutes les opérations de redimensionnement, appliquez des ajustements à la dernière colonne uniquement" ce qui signifie que vous devez définir le autoresizemode à la fin de votre code , sinon setPreferredWidth () n'aura aucune incidence !

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);
10
Rico Ocepek

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);
5
Oleg Mikhailov

En lisant la remarque de Kleopatra (sa deuxième fois, elle suggéra de jeter un coup d'œil à javax.swing.JXTable , et je suis désolée de ne pas avoir regardé la première fois :)). suivez 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 le tableau, redimensionnez les largeurs de colonne du tableau à la largeur totale actuelle du tableau . d’ints pour les largeurs de colonne (relatives)):

private int[] columnWidths=null;

J'utilise cette fonction pour définir les largeurs de colonne de 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 l'ensemble ComponentListener 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);
4
michel.iamit
fireTableStructureChanged();

le comportement de redimensionnement par défaut ! 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 paramètres seront réinitialisés. Cet effet secondaire peut arriver indirectement. F.e. En conséquence, le modèle de données lié a été modifié de manière à appeler cette méthode, une fois les propriétés définies.

1
count0

Utilisez ce code. Cela a fonctionné pour moi. J'ai considéré pour 3 colonnes. Changez 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);
        }
0
Arijit