Установка ширины 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 - это произвольное магическое число, вы, вероятно, захотите немного поиграть с ним, это зависит от разрешения экрана и ожиданий пользователя.
Если предпочтительная ширина меньше минимальной ширины или больше максимальной ширины, размер столбца не будет изменен на предпочтительную ширину. Вы также должны контролировать минимальную ширину и максимальную ширину, чтобы гарантировать, что ваша предпочтительная ширина находится между ними.
Кроме того, по умолчанию размер столбцов автоматически изменяется при изменении размера таблицы, также следует проверить режим автоматического изменения размера.