将JScrollPane缩小到与JTable相同的高度

19

我目前有类似以下的JTables嵌套在JScrollPanes中:

图片描述

问题是当每个表格创建时,其中的行数是可变的。我想要做的是,如果表格太短,则将JScrollPane缩小,但如果表格太长,则保持其在固定大小。

我该如何实现这一点?


6
有截图就点赞。如果有图片,回答这类问题就更容易了。 - OscarRyz
5个回答

21
Dimension d = table.getPreferredSize();
scrollPane.setPreferredSize(
    new Dimension(d.width,table.getRowHeight()*rows+1));

这里的 rows 表示数据行数或限制。


似乎这只会为标题栏提供1个像素。高度计算可能意味着table.getRowHeight() * (rows+1)? - KathyA.
1
这并没有考虑到 L&F 的各个方面。如果在 scrollPane 中可见滚动条,它将压缩表格列的首选大小。它还假设标题高度等于行高,但这并不总是正确的。 - AJNeufeld

6

以下(目前被接受的)代码没有考虑外观和感觉的各个方面:

Dimension d = table.getPreferredSize();
scrollPane.setPreferredSize(
    new Dimension( d.width, table.getRowHeight() * (rows+1) ));
  1. 表头行不一定是table.getRowHeight()像素高。(在“Metal” L&F中,它更高)
  2. scrollPane中的垂直滚动条会使表格变小,而不是其首选大小。
  3. 水平滚动条将占用额外空间,因此不会显示所有请求的rows行。

应改用以下代码:

table.setPreferredScrollableViewportSize(
    new Dimension(
        table.getPreferredSize().width,
        table.getRowHeight() * visible_rows));
scrollPane 会请求表格的首选大小,并在此基础上添加标题和滚动条的额外空间。
下面展示了一个包含 4 行的 JTable,当将 visible_rows4 减少到 3 时的差异。自动将 JScrollPane 的首选宽度填充以包括滚动条,而不是压缩表格列。另请注意,标头(与行高不同)的空间也会自动提供;它不包含在 visible_rows 计数中。

JTable with and without scrollbar


我曾经遇到过类似的问题,而这个解决方案帮助了我,而不是首选的那个。 - Sree

5
我在这个上下文中使用setPreferredScrollableViewportSize(),然后根据需要使用pack()revalidate()
补充说明:

你怎么使用它?

这是在JTable中实现Scrollable的一个特性。这里有几个示例。互补的getPreferredScrollableViewportSize()也可能会有用。

这并不是很有帮助。你怎么使用它? - Alex Bliskovsky

2
使用GridBagLayout管理器,并将JScrollPane的最大大小设置为您想要的大小。如果表格更大,则JScroll不会超出该大小。
然后,添加一个glue组件(我认为它类似于BoxLayout.createVerticalGlue之类的东西),这是一个空组件,只占用剩余空间。
因此,当表格较小时,该组件将占用剩余空间;如果表格较大,则该组件将不占用任何空间,因为JScrollPane正在使用它。

0
如果您使用MigLayout,当添加包含JTable的滚动窗格时,可以指定约束growx而不是grow,以使其仅水平拉伸。
现在滚动窗格位于其父级中间。您可以在行约束中设置它对齐到行的top。或者,在组件约束中:aligny top

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接