[英]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
來的父類JTable
是JComponent
,但我結束了一個堆棧溢出錯誤。 無論如何,這似乎不是正確的解決方案。
我想發生的是,因為我的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張圖像。 忽略標題對齊,我已經有一個解決方案,只是還沒有完全實現它。
對此問題的任何想法將不勝感激。 如果您認為有幫助的話,也很樂意發布任何您認為可能有用的代碼。
因此,經過大量修改和研究,這是由於表沒有滾動窗格。 我最初不是這樣做的,因為它在其周圍放置了一個時髦的邊框,並且將border設置為null無效。 我要做的是設置一個空邊框。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.