2012-02-29 69 views
1
private float[] cwidth = { 0.1f, 0.3f, 0.3f, 0.2f, 0.1f }; 

setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

for (int i = 0; i < cwidth.length; i++) { 
      getColumnModel().getColumn(i).setPreferredWidth((int) (getPreferredScrollableViewportSize().width * cwidth[i])); 
     } 

我有以下问题:设置TableColumn来的宽度动态

我有5列一个JTable。第一个是3位数字,第二个是字符串,然后是JProgressBar,另一个字符串和一个按钮。

现在我希望他们有宽度取决于表的大小。在上面你可以看到我的实际尝试,但这不起作用。

我已经搜索了网页,但是我发现并没有帮助我,因为它总是将大小设置为非动态大小。

我希望你能帮助我。

感谢您的帮助。我喜欢这一面!

这里我的解决办法:

for (int i = 0; i < cwidth.length; i++) { 
      getColumnModel().getColumn(i).setPreferredWidth((int) (600 * cwidth[i])); 
      getColumnModel().getColumn(i).setMinWidth((int) (100 * cwidth[i])); 
      getColumnModel().getColumn(i).setMaxWidth((int) (1000 * cwidth[i])); 
     } 

回答

2

干扰表的内部列布局(基本上,它是自己的布局管理器,列为“子”)并不是微不足道的。光明的一面:默认行为并不坏,它已经有了合理的调整大小模式。默认的resizeAll最有可能做你想要的只是一个小的配置需要 - 这不是太intuitve :-)

首先,阅读JTable.doLayout()的API文档 - 它描述了确切的行为。最重要的一点是要了解跨列的宽度如何过量分配:

deltaI = (excess) * ((maxI - prefI)/(maxAll - prefAll)) 

(带后缀我表示了单个列和单个值,分别为所有的总和),这是最大的个体差异的因素/ pref加上max/pref的总和。看起来像一个合理的决定,只是......默认最大值为Integer.MAX,对于所有列,该因子大致相同,而不考虑它们的优先级。基本上,为什么调整大小显得如此不直观,以及为什么需要调整maxSize(就像@Lajos Arpad已经指出的:-)以获得合理的默认调整大小行为。的

因此,而不是试图做自己动手(这是不是一个好主意,因为总是与布局管理),根据需要配置列属性:

// start out with a reasonable pref size, f.i. from a prototype or 
// measuring the actual cell content (both supported by JXTable) 
forEachColumn 
    column.setPreferredWidth(....); 

// then configure the maxWidth proportionally 
private float[] cwidth = { 0.1f, 0.3f, 0.3f, 0.2f, 0.1f }; 
forEachColumn 
    int max = ((int) (1000f * cwidth[columnExt.getModelIndex()])); 
    columnExt.setMaxWidth(max); 

注意,1000是一个任意神奇的数字,你可能想玩一点,它取决于屏幕分辨率和用户期望

+1

+1太实用的方式,非常复杂,恐怕 – mKorbel 2012-02-29 12:54:15

+0

好的,谢谢我会尽力去看看会发生什么,虽然我有类似的尝试,但没有帮助。 – NotANormalNerd 2012-02-29 13:48:03

2

如果首选宽度小于最小宽度大于最大宽度那么你的列将不被首选宽度调整大小更小或更大。您还应该控制最小宽度和最大宽度,以保证您的首选宽度在它们之间。

此外,默认情况下,列会自动根据表大小更改调整大小,您也应该检查自动调整大小模式。

+2

+1,但仅用于关闭AutoResize – mKorbel 2012-02-29 10:24:59

+0

我试过它有无最大和最小设置。有和没有setAutoResize关闭。但是没有办法解决这个问题。有一个问题,我不能得到表的实际大小来计算正确的大小。 – NotANormalNerd 2012-02-29 11:56:29

+0

您是否使用JTable对象的getColumnModel()。getColumn(index)方法来访问列对象? – 2012-02-29 13:10:05