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