簡體   English   中英

如何從JTable中自動調整大小中排除列

[英]How to exclude columns from auto-resizing in a JTable

我有一個在TableColumnModel中指定5列的JTable 我希望表格使用面板中所有可用的水平空間(可以變化),但我想將調整大小限制為最后三行。

更詳細地:

前兩列以首選寬度初始化,但是用戶應該能夠通過使用鼠標拖動來手動調整列的大小。

最后三列應平均划分前兩列未使用的所有剩余空間。 編輯:他們還需要手動調整大小。

我嘗試了以下操作:將表設置為autoResizeMode JTable.AUTO_RESIZE_ALL_COLUMNS 這樣可以耗盡所有可用空間,但是(顯然)它還調整了前兩列的大小。 為此,我為前兩列設置了最小值和最大值。 那行得通,但是違反了我手動調整它們大小的限制。

JTable -API中是否有一種簡單的方法可以實現此目的?

提前致謝!

正如Thomas已經回答的那樣,沒有簡單的api可以實現您想要的:您必須自己實現行為。 在一般情況下,這可能並非微不足道,但在您的具體情況下卻可以解決。 為了確保我確實正確理解您的要求:

A)用戶可以調整2列的大小,用戶不能調整3列的大小(它們應具有相同的寬度)

B)當用戶調整2個可調整大小的列之一的大小時,其他可調整大小的列應保持其當前寬度,任何空間分布應僅影響3個不可調整大小的列,並在其中均勻分配多余/缺失的寬度。

基本上,訣竅是在調整其他可調整大小的列中的一個的同時“固定”其大小。 通過將其最小值/最大值都設置為其首選值,可以實現“修復”。 然后,將在AUTO_RESIZE_ALL_COLUMNS模式下自動在其余列上均勻分配空間。 問題是要檢測調整大小的開始/停止:JTableHeader具有一個屬性resizingColumn,不幸的是它在內核中是未綁定的(aka:不會在更改時觸發)。 另一方面,SwingX(您可能已經猜到我早晚會提到SwingX :-)將該屬性提升為成熟的bean屬性-因此只需偵聽並更新適當的最小/最大大小約束即可。 這是使用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以返回子類頭

請享用! 珍妮特

AFAIK無法將列從自動調整大小中排除。 設置最小/最大大小會影響大小計算,但是從JTable來源看來,您似乎無法排除列。

使用JTable.AUTO_RESIZE_ALL_COLUMNS ,不能限制要調整大小的列的范圍。 因此,將調用表模型來設置每列的列寬,並應用約束。 但是,我看不到表模型可以區分自動調整大小和手動調整大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM