2017-06-03 72 views
0

我創建了一個JTreeTable其中TreeCellRendererJTable。這允許我爲每行有不同的TableColumnModelJTree的兄弟姐妹分享TableColumnModel。它效果很好。我可以選擇一行並顯示一組不同的列,而不用實際更改其他行中的數據,即使在不同的級別。的JTable是在調整我的列寬

我雖然在當選擇不同的行JTable中正在改變我的TableColumn帶寬度和將其設置爲首選大小的問題。所以效果是,拖動一列的寬度,然後選擇不同的行將其設置回首選大小。

我已經嘗試了一些事情解決這個問題,包括添加TableColumnModelListener,當我改變寬度I設定柱的優選大小。這不起作用,因爲JTable在更改後將首選大小設置爲15。

我已經查明代碼回是什麼原因造成這一點。這是導致我悲痛的方法。該方法正在調用私有方法setWidthsFromPreferredWidths(...)。這個方法是設置我的TableColumn寬度。

我試圖覆蓋doLayout()方法,因爲它是公開的,但是當我已經覆蓋該方法時,我無法撥打super.doLayout()。不要這麼說,會導致一些很奇怪的用戶界面問題,就像你想象的那樣我也嘗試將this鑄造成JTable的超類,它是JComponent,但我最終發生堆棧溢出錯誤。無論如何,這並不像是正確的解決方案。

我在想什麼是因爲我的JTable在面板內部作爲樹形單元的渲染器而不是在滾動窗格內部,所以佈局出了問題。我不知道雖然。下面是私有方法我上面提到的內部代碼:

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中希望將列調整爲首選大小,因爲它認爲它沒有足夠的空間。我嘗試在本地複製粘貼此方法,但由於涉及私有方法,並且它越來越深,所以我停止了這種方法。目的是試圖調試爲什麼選擇調整寬度。如果我能解決根本原因,那可能是最好的解決方案。

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

JTreeTable-Level1 JTreeTable-Level2

對這個問題的任何想法,將不勝感激。如果您認爲它有幫助,也很高興發佈您認爲可能有用的任何代碼。

回答

0

所以很多修改和調查後,這是由於沒有對桌的滾動窗格。我最初並沒有這樣做,因爲它在它周圍放置了一個時髦的邊框,並且將邊框設置爲null不起作用。我必須做的是設置一個空白邊框。