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.

83
demandé sur Jason Plank 2009-06-05 06:04:30

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.

41
répondu Eddie 2009-06-05 03:47:19

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()

22
répondu akf 2009-06-05 03:48:28

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);
10
répondu Rico Ocepek 2018-08-13 09:49:48

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);
5
répondu Oleg Mikhailov 2016-06-01 07:35:31

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);
4
répondu michel.iamit 2016-02-18 17:09:41
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.

1
répondu count0 2012-06-06 14:50:19

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);
        }
0
répondu Arijit 2014-05-19 14:08:06