Установка ширины TableColumns динамически - PullRequest
1 голос
/ 29 февраля 2012
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 ]

2 голосов
/ 29 февраля 2012

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

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

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

(с postFix I, обозначающим отдельный столбец и всю сумму отдельных значений соответственно), то есть коэффициент индивидуальной разности max / pref к сумме max / pref. Выглядит как разумное решение, просто ... с максимальным значением по умолчанию, равным 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 - это произвольное магическое число, вы, вероятно, захотите немного поиграть с ним, это зависит от разрешения экрана и ожиданий пользователя

2 голосов
/ 29 февраля 2012

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

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

...