簡體   English   中英

JTable正在調整我的列寬

[英]JTable is resizing my column widths

我創建了一個JTreeTable ,其中TreeCellRenderer是一個JTable 這使我可以為每行使用不同的TableColumnModel JTree共享一個TableColumnModel 效果很好。 我可以選擇一行並顯示一組不同的列,而不必實際更改其他行中的數據,即使在不同級別也是如此。

我有一個問題,盡管當選擇其他行時,JTable會更改TableColumn的寬度並將其設置為首選大小。 因此,效果是拖動一列的寬度,然后選擇另一行,將其設置回首選大小。

我嘗試了多種方法來解決此問題,包括添加TableColumnModelListener並在更改寬度時設置了列的首選大小。 這是行不通的,因為JTable在更改后將首選大小設置為15。

我已將代碼追溯到導致此問題的原因。 這是導致我悲痛的JTable.doLayout()方法。 該方法正在調用私有方法setWidthsFromPreferredWidths(...) 此方法是設置我的TableColumn寬度的方法。

我嘗試重寫doLayout()方法,因為它是公共的,但是當我已經重寫該方法時,無法調用super.doLayout() 如您所想,不進行調用會導致一些非常奇怪的UI問題。 我也試着鑄造this來的父類JTableJComponent ,但我結束了一個堆棧溢出錯誤。 無論如何,這似乎不是正確的解決方案。

我想發生的是,因為我的JTable在作為樹單元的渲染器的面板內部而不是在滾動窗格內部,所以布局出了點問題,但我不確定。 以下是我上面引用的private方法內部的代碼:

private void setWidthsFromPreferredWidths(final boolean inverse) {
    int totalWidth     = getWidth();
    int totalPreferred = getPreferredSize().width;
    int target = !inverse ? totalWidth : totalPreferred;

    final TableColumnModel cm = columnModel;
    Resizable3 r = new Resizable3() {
        public int  getElementCount()      { return cm.getColumnCount(); }
        public int  getLowerBoundAt(int i) { return cm.getColumn(i).getMinWidth(); }
        public int  getUpperBoundAt(int i) { return cm.getColumn(i).getMaxWidth(); }
        public int  getMidPointAt(int i)  {
            if (!inverse) {
                return cm.getColumn(i).getPreferredWidth();
            }
            else {
                return cm.getColumn(i).getWidth();
            }
        }
        public void setSizeAt(int s, int i) {
            if (!inverse) {
                cm.getColumn(i).setWidth(s);
            }
            else {
                cm.getColumn(i).setPreferredWidth(s);
            }
        }
    };

    adjustSizes(target, r, inverse);
}

查看代碼,我認為發生的事情是getWidth()方法導致JTable想要將列的大小調整為preferredsize,因為它認為它沒有足夠的空間。 我只是嘗試復制此方法,然后將其粘貼到本地,但是由於涉及私有方法,並且這種方法越來越深入,因此我停止了該方法。 目的是嘗試調試為什么選擇調整寬度。 如果我能解決根本原因,那可能是最好的解決方案。

JTree本身在JScrollPane內部。 JTableHeader設置為ViewPortColumnHeaderView 以下是我選擇不同行的2張圖像。 忽略標題對齊,我已經有一個解決方案,只是還沒有完全實現它。

JTreeTable-1級 JTreeTable-2級別

對此問題的任何想法將不勝感激。 如果您認為有幫助的話,也很樂意發布任何您認為可能有用的代碼。

因此,經過大量修改和研究,這是由於表沒有滾動窗格。 我最初不是這樣做的,因為它在其周圍放置了一個時髦的邊框,並且將border設置為null無效。 我要做的是設置一個空邊框。

暫無
暫無

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

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