我創建了一個JTreeTable
其中TreeCellRenderer
是JTable
。這允許我爲每行有不同的TableColumnModel
。 JTree
的兄弟姐妹分享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張圖片。忽略標題對齊,我已經有一個解決方案,只是沒有完全實現它。
對這個問題的任何想法,將不勝感激。如果您認爲它有幫助,也很高興發佈您認爲可能有用的任何代碼。