TableColumn setPreferredWidth не работает - PullRequest
7 голосов
/ 16 октября 2011

У меня есть JTable с несколькими столбцами. Я хочу, чтобы размер определенного столбца изменился. Я надеялся, что с помощью setPreferredWidth размер столбца изменится до этого размера, или размер содержимого будет таким, что усечение не произойдет , и пусть остальные столбцы займут оставшееся пространство, но вместо этого все из столбцов, включая тот, который я изменил размер, поровну разделить все пространство таблицы; как будто setPreferredWidth вообще ничего не сделал . По сути, я хочу иметь возможность установить ширину столбца и уменьшить его до этого размера без усечения содержимого (я уже подчеркнул, что слишком много?) Таким образом, чтобы все столбцы, которые имеют не был изменен размер заполнить оставшееся пространство. Использование setMaxWidth усекает содержимое (я уже упоминал, что мне это не понравилось?) Как изменить размер / уменьшить столбец без его усечения и без него абсолютно ничего ? Вот код нарушения:

for (int i = 0, x = 0; i < table.getColumnModel().getColumnCount(); i++)
    if ((x = model.getColumnWidth(i)) > -1)
        table.getColumnModel().getColumn(i).setPreferredWidth(x);

Таблица находится в JPanel (MyListPanel - BorderLayout), который находится в другой JPanel (GridBagLayout), добавленной с:

new GridBagConstraints(0, 3, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(2, 0, 0, 2), 0, 0))

РЕДАКТИРОВАТЬ: Это конструктор для моего подкласса JPanel:

public MyListPanel(boolean showHeader, String title, ColData...columns) {
    super(new BorderLayout());
    model = new MyListTableModel(columns);
    table = new JTable(model);

    table.addFocusListener(this);

    add(table);
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    setTitle(title);

    if (showHeader)
        add(table.getTableHeader(), BorderLayout.NORTH);

    for (int i = 0, x = 0; i < table.getColumnModel().getColumnCount(); i++)
        if ((x = model.getColumnWidth(i)) > -1)
            table.getColumnModel().getColumn(i).setPreferredWidth(x);

    setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
}

И MyListTableModel.ColData:

public static class ColData {
    private int index;
    private String title;
    private int width;
    public ColData(int _index, String _title, int _width) { index = _index; title = _title; width = _width; }
}

Ответы [ 5 ]

8 голосов
/ 16 октября 2011

Включено:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
4 голосов
/ 25 марта 2015

У меня была похожая проблема, хотя я попробовал два других ответа здесь.В моем случае, в некоторых случаях ширина будет установлена ​​правильно, а в других - нет.Я обнаружил, что проблема была вызвана тем, что я пытался установить ширину столбцов сразу после изменения модели таблицы.Я обнаружил, что установка ширины столбца внутри SwingUtilities.invokeLater () сделала свое дело.IE

SwingUtilities.invokeLater(new Runnable(){

    @Override
    public void run() {
         int width = 100;  
         for (int column = 1; column < table.getColumnCount(); column++) {
             columnModel.getColumn(column).setPreferredWidth(width);
         }
    }
}
3 голосов
/ 29 августа 2014

Я знаю, что это немного поздно, поэтому в основном для будущих читателей, но у меня возникла та же проблема, и я решил ее, установив для столбца предпочтительную ширину и максимальную ширину .то же значение.

1 голос
/ 04 января 2017

У меня была та же проблема и, читая ответ @Jay Askren, у меня получилось обратное. Я должен был установить ширину в методе, где создавалась таблица.

public class Example{
    //..stuff
    private JTable myTable;

    public Example{
    //..stuff
    myTable = AnotherClass.getTable();
    myTable .getColumnModel().getColumn(0).setPreferredWidth(100);//not here
    }

}

public class AnotherClass{
    public static JTable getTable(){
    JTable table= new JTable();
    table.setModel(anyModel);
    table.getColumnModel().getColumn(0).setPreferredWidth(100);//Here!
    return table
   }
}
0 голосов
/ 30 марта 2019

Установите все три из setMinWidth, setMaxWidth и setPreferredWidth, где минимальная ширина <= предпочтительная ширина <= максимальная ширина.</p>

        int[] minColSizes       = { 15,  55,  75,  50,  50,  50 };
        int[] preferredColSizes = { 25,  75, 125, 100, 100, 100 };
        int[] maxSizes          = { 50, 100, 200, 200, 200, 200 };
        for ( int index = 0; index < preferredColSizes.length; index++ )
        {
            myTable.getColumnModel().getColumn(index).setMinWidth ( minColSizes[index] );
            myTable.getColumnModel().getColumn(index).setMaxWidth ( preferredColSizes[index] + 100 );
            myTable.getColumnModel().getColumn(index).setPreferredWidth ( maxSizes[index] );
        }
...