Как уже ответил Томас, нет простого API-интерфейса для достижения того, чего вы хотите: вы должны сами реализовать это поведение.Это может быть не тривиальным в общем контексте, но управляемым в вашем конкретном контексте.Просто чтобы убедиться, что я правильно понимаю ваше требование:
A) 2 столбца могут быть изменены пользователем, 3 столбца не могут быть изменены пользователем (они должны иметь одинаковую ширину)
B)в то время как пользователь изменяет размер одного из 2 столбцов с изменяемым размером, другие столбцы с изменяемым размером должны сохранять свою текущую ширину, любое распределение пространства должно влиять только на 3 столбца с изменяемым размером, равномерно распределяя избыточную / отсутствующую ширину по ним.
По сути, хитрость заключается в том, чтобы «зафиксировать» размер других изменяемых размеров столбцов при изменении размера одного из них.«Исправление» достигается путем установки его минимального / максимального значения на свое предпочтение.Тогда равномерное распределение пространства по оставшимся столбцам произойдет автоматически в режиме AUTO_RESIZE_ALL_COLUMNS.Проблема состоит в том, чтобы обнаружить начало / остановку изменения размера: JTableHeader имеет свойство resizingColumn, которое, к сожалению, не связано (иначе: не срабатывает при изменении) в ядре.SwingX, с другой стороны, (как вы уже догадались, я бы рано или поздно упомянул SwingX :-) повысил это свойство до полноценного свойства bean-компонента - поэтому просто слушайте и обновляйте ограничения размера min / max по мере необходимости.Вот фрагмент кода с использованием SwingX
// custom ColumnFactory to configure the columns
ColumnFactory factory = new ColumnFactory(){
/**
* @inherited <p>
*/
@Override
public void configureTableColumn(TableModel model,
TableColumnExt columnExt) {
super.configureTableColumn(model, columnExt);
columnExt.setResizable(columnExt.getModelIndex() < 2);
if (columnExt.getModelIndex() >= 2) {
columnExt.setPreferredWidth(50);
} else {
columnExt.setPreferredWidth(150);
}
}
/**
* @inherited <p>
* Overridden to do nothing
*/
@Override
public void configureColumnWidths(JXTable table,
TableColumnExt columnExt) {
}
};
final JXTable table = new JXTable();
table.setColumnFactory(factory);
table.setModel(new DefaultTableModel(20, 5));
// propertyChangeListener
PropertyChangeListener l = new PropertyChangeListener() {
TableColumn first = table.getColumn(0);
TableColumn second = table.getColumn(1);
@Override
public void propertyChange(PropertyChangeEvent evt) {
TableColumn resizingColumn = (TableColumn) evt.getNewValue();
if (resizingColumn == null) {
TableColumn oldResizing = (TableColumn) evt.getOldValue();
TableColumn other = oldResizing == first ? second : first;
other.setMaxWidth(Integer.MAX_VALUE);
other.setMinWidth(15);
} else {
TableColumn other = resizingColumn == first ? second : first;
other.setMaxWidth(other.getPreferredWidth());
other.setMinWidth(other.getPreferredWidth());
}
}
};
table.getTableHeader().addPropertyChangeListener("resizingColumn", l);
Это SwingX для ленивости - достаточно легко реализовать самостоятельно:
a) вручную настроить tableColumns
b) подкласс JTableHeader иреализовать setResizingColumn для запуска при изменении
c) подкласс JTable и реализовать createTableHeader для возврата подклассового заголовка
Наслаждайтесь!Жанетт