Таблица setPreferredWidth столбца не работает

#java #swing #resize #jtable

#java #качать #изменение размера #jtable

Вопрос:

У меня есть 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; }
}
  

Ответ №1:

Включить :

 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
  

Ответ №2:

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

 SwingUtilities.invokeLater(new Runnable(){

    @Override
    public void run() {
         int width = 100;  
         for (int column = 1; column < table.getColumnCount(); column  ) {
             columnModel.getColumn(column).setPreferredWidth(width);
         }
    }
}
  

Комментарии:

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

Ответ №3:

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

Ответ №4:

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

 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
   }
}
  

Ответ №5:

Установите все три setMinWidth, setMaxWidth и setPreferredWidth, где minimum_width <= preferred_width <= maximum_width .

         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] );
        }