Как исключить столбцы из автоматического изменения размера в JTable - PullRequest
0 голосов
/ 29 марта 2011

У меня есть JTable с 5 столбцами, указанными в TableColumnModel. Я хочу, чтобы таблица использовала все доступное горизонтальное пространство на панели (которое может изменяться), но я хочу ограничить изменение размера до трех последних строк.

Более подробно:

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

Последние три столбца должны делить поровну все оставшееся пространство, которое не используется первыми двумя столбцами. РЕДАКТИРОВАТЬ: они также должны быть изменяемого размера вручную.

Я пробовал следующее: Установка таблицы в autoResizeMode JTable.AUTO_RESIZE_ALL_COLUMNS. Это удалось в занимая все доступное пространство, но (очевидно) он также изменил размеры первых двух столбцов. Я отреагировал на это, установив min и max для первых двух столбцов. Это сработало, но это нарушило мое ограничение на изменение их размера вручную.

Есть ли в JTable -API простой способ добиться этого?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 29 марта 2011

Как уже ответил Томас, нет простого 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 для возврата подклассового заголовка

Наслаждайтесь!Жанетт

0 голосов
/ 29 марта 2011

AFAIK, нет способа исключить автоизменение размеров столбцов. Установка минимального / максимального размера влияет на вычисление размера, но из источника JTable кажется, что вы не можете исключить столбцы.

При использовании JTable.AUTO_RESIZE_ALL_COLUMNS диапазон изменяемых размеров столбцов не может быть ограничен. Таким образом, модель таблицы вызывается для установки ширины столбца для каждого столбца, и там применяются ограничения. Однако я не вижу, чтобы модель таблицы могла различать автоматическое и ручное изменение размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...