Установка ширины TableColumns динамически

private float[] cwidth = { 0.1f, 0.3f, 0.3f, 0.2f, 0.1f };

setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

for (int i = 0; i < cwidth.length; i++) {
            getColumnModel().getColumn(i).setPreferredWidth((int) (getPreferredScrollableViewportSize().width * cwidth[i]));
        }

У меня есть следующая проблема:

У меня есть JTable с 5 столбцами. Первый - это трехзначное число, второй - строка, затем JProgressBar, другая строка и кнопка.

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

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

Я надеюсь, что вы можете мне помочь.

Спасибо за помощь. Я люблю эту сторону!!

Вот мое решение:

for (int i = 0; i < cwidth.length; i++) {
            getColumnModel().getColumn(i).setPreferredWidth((int) (600 * cwidth[i]));
            getColumnModel().getColumn(i).setMinWidth((int) (100 * cwidth[i]));
            getColumnModel().getColumn(i).setMaxWidth((int) (1000 * cwidth[i]));
        }

2 ответа

Решение

Вмешиваться во внутреннюю разметку столбцов таблицы нетривиально (по сути, это собственный LayoutManager со столбцами как "дочерние"). С другой стороны, поведение по умолчанию не так уж и плохо, у него уже есть разумные режимы изменения размера. Значение по умолчанию resizeAll, скорее всего, делает то, что вы хотите, с небольшим количеством необходимых настроек - что не слишком интуитивно:-)

Для начала, прочитайте api doc JTable.doLayout() - он описывает точное поведение. Наиболее важным моментом является понимание того, как избыточная ширина распределяется по столбцам:

deltaI = (excess) * ((maxI - prefI) / (maxAll - prefAll)) 

(с постфиксом I, обозначающим отдельный столбец и всю сумму отдельных значений, соответственно), то есть коэффициент индивидуальной разности max/pref к сумме max/pref. Выглядит как разумное решение, просто... с max по умолчанию Integer.MAX, этот коэффициент примерно одинаков для всех столбцов, независимо от их prefWidht. По сути, именно поэтому изменение размера кажется таким неинтуитивным и почему вам нужно настроить maxSize (как @Lajos Arpad уже указывал:-), чтобы получить разумное поведение по умолчанию при изменении размера.

Поэтому вместо того, чтобы пытаться сделать это самостоятельно (что не очень хорошая идея, как всегда с LayoutManager), настройте свойства столбца по мере необходимости:

// start out with a reasonable pref size, f.i. from a prototype or 
// measuring the actual cell content (both supported by JXTable)
forEachColumn
    column.setPreferredWidth(....);

// then configure the maxWidth proportionally 
private float[] cwidth = { 0.1f, 0.3f, 0.3f, 0.2f, 0.1f };
forEachColumn
    int max = ((int) (1000f * cwidth[columnExt.getModelIndex()]));
    columnExt.setMaxWidth(max);

Обратите внимание, что 1000 - это произвольное магическое число, вы, вероятно, захотите немного поиграть с ним, это зависит от разрешения экрана и ожиданий пользователя.

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

Кроме того, по умолчанию размер столбцов автоматически изменяется при изменении размера таблицы, также следует проверить режим автоматического изменения размера.

Другие вопросы по тегам