具有自定义默认渲染器的JTable标头不会在JScrollPane内滚动

时间:2016-01-25 06:16:58

标签: java swing jtable jscrollpane tablecellrenderer

我在JTcbedPane内部的JScrollPane中有一个JTable。表格标题滚动正常,直到我为它设置一个动态改变标题单元格的宽度和高度的自定义默认渲染器,即:

table.getTableHeader().setDefaultRenderer(new MyHeaderRenderer());

...其中MyHeaderRenderer扩展了JLabel,其getTableCellRendererComponent()方法设置了这样的首选大小:

table.getTableHeader().setPreferredSize(new Dimension(width, height));

设置自定义渲染器后,表体继续正确滚动,但标题保持固定在JScrollPane的左上角。我相信渲染器会在那个位置不断重新绘制标题。

我该如何解决这个问题?

感谢。

2 个答案:

答案 0 :(得分:0)

我的问题是我有很多带有长标题文本的列,因此我创建了一个标题渲染器,根据单元格文本的长度设置标题单元格的高度和宽度。

事实证明,您无法通过设置表格标题本身的首选大小来调整标题单元格的大小,或者您最终会将标题始终固定在表格的左上角。

关于这件事,我没有找到解决办法。 我尝试在渲染器外设置preferredSize:它没有工作,这意味着问题不是连续渲染。 我尝试使用JTextArea而不是JLabel:它没有任何区别。 我尝试重写JTable doLayout()方法:它没有用。

我通过删除:

解决了这个问题
table.getTableHeader().setPreferredSize(new Dimension(width, height));

...并将这些代码行添加到getTableCellRendererComponent()方法中:

table.getColumnModel().getColumn(column).setPreferredWidth(width); //sets the width
setPreferredSize(new Dimension(width, height)); //sets the height of the JLabel returned by the renderer

这是我能想到的最好的。如果有人找到更好的解决方案,请分享: - )

答案 1 :(得分:0)

我遇到了同样的问题并找到了解决方法。 JTable头是一个单独的组件,存储在父JScrollPane ColumnHeader中。因此,我们可以设置JScrollPane ColumnHeader的首选大小,而不是覆盖标头首选大小。

JScrollPane scrollPane = new JScrollPane(table);
scrollPane.getColumnHeader().setPreferredSize(new Dimension(0, height));

幸运的是,JScrollPane会忽略列标题宽度,因此您可以在此安全地设置零。