将JScroll Pane缩小到与JTable相同的高度

Ale*_*sky 19 java swing jtable jscrollpane

我目前在JScrollPanes中嵌套了JTables,如下所示:

在此输入图像描述

我的问题是,在创建表时,每个表中的行数是可变的.我想要做的是如果表太短,则使JScrollpane变小,但如果表太长,我想将它保持在设定的大小.

我怎么能做到这一点?

And*_*son 22

Dimension d = table.getPreferredSize();
scrollPane.setPreferredSize(
    new Dimension(d.width,table.getRowHeight()*rows+1));
Run Code Online (Sandbox Code Playgroud)

其中,rows表示数据行数或限制.


tra*_*god 6

setPreferredScrollableViewportSize()在此上下文中使用,后跟pack()revalidate()根据需要使用.

附录:

你如何使用它?

这是Scrollablein 的实现的一个特征JTable.以下是几个例子.补充getPreferredScrollableViewportSize()也可能是有用的.


AJN*_*eld 6

以下(当前接受的)代码没有考虑外观的各个方面:

Dimension d = table.getPreferredSize();
scrollPane.setPreferredSize(
    new Dimension( d.width, table.getRowHeight() * (rows+1) ));
Run Code Online (Sandbox Code Playgroud)
  1. 标题行的table.getRowHeight()高度不一定是像素。(在“金属”L&F 中,它更高)
  2. 中的垂直滚动条scrollPane会将表格挤压得小于其首选大小。
  3. 水平滚动条将占用额外空间,因此并非所有请求的rows行都可见。

应改用以下代码:

table.setPreferredScrollableViewportSize(
    new Dimension(
        table.getPreferredSize().width,
        table.getRowHeight() * visible_rows));
Run Code Online (Sandbox Code Playgroud)

scrollPane会要求表的首选大小,并添加到页眉和滚动条任何额外的空间。

下面显示了 aJTable与 4 行的差异,当visible_rows从 减少4到 时3。的首选宽度JScrollPane会自动填充以包含滚动条,而不是压缩表格列。还要注意标题的空间(不同于行高)也是自动提供的;它不包括在visible_rows计数中。

带和不带滚动条的 JTable