Java 将JScroll窗格收缩到与JTable相同的高度

Java 将JScroll窗格收缩到与JTable相同的高度,java,swing,jtable,jscrollpane,Java,Swing,Jtable,Jscrollpane,我目前在JScrollPane中嵌套了JTables,如下所示: 我的问题是,创建表时,每个表中的行数是可变的。我想做的是,如果表太短,将JScrollpane变小;如果表太长,则将其保持在设定的大小 如何实现这一点?使用GridBagLayout管理器,并将JScrollPane的最大大小设置为您想要的大小。如果表更大,JSCROL将不会超过该大小 然后,添加一个粘合组件(我认为它类似于BoxLayout.createVerticalGlue或类似的东西),它是一个只占用剩余空间的空组件 因

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

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


如何实现这一点?

使用GridBagLayout管理器,并将JScrollPane的最大大小设置为您想要的大小。如果表更大,JSCROL将不会超过该大小

然后,添加一个粘合组件(我认为它类似于BoxLayout.createVerticalGlue或类似的东西),它是一个只占用剩余空间的空组件

因此,当表较小时,此组件将占用剩余空间,如果表较大,则不会占用任何空间,因为JScrollPane正在使用它

我在此上下文中使用,然后根据需要使用
pack()
revalidate()

增编:

你如何使用它

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

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

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

如果使用MigLayout,在添加包含JTable的滚动窗格时,可以指定约束
growx
,而不是
grow
,使其仅水平拉伸

现在,滚动窗格位于其父的中间。您可以在行中设置约束,使其与行的顶部对齐。或者,在组件约束中:

aligny top

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

Dimension d = table.getPreferredSize();
scrollPane.setPreferredSize(
    new Dimension( d.width, table.getRowHeight() * (rows+1) ));
  • 标题行的高度不一定是
    table.getRowHeight()
    像素。(在“金属”L&F中,它更高)
  • 滚动窗格
    中的垂直滚动条将挤压小于首选大小的表格
  • 水平滚动条将占用更多空间,因此并非所有请求的
    行都可见
  • 应改为使用以下代码:

    table.setPreferredScrollableViewportSize(
        new Dimension(
            table.getPreferredSize().width,
            table.getRowHeight() * visible_rows));
    
    滚动窗格
    将询问表格的首选大小,并为标题和滚动条添加额外的空间

    下面显示了当
    visible\u rows
    4
    减少到
    3
    时,具有4行的
    JTable
    的差异。
    JScrollPane
    的首选宽度会自动填充,以包括滚动条,而不是压缩表列。此外,还自动为标题提供空间(与行高不同);它不包括在
    可见行中


    +1用于屏幕提示。如果有图片的话,回答这类问题就容易多了。这不是很有帮助。你怎么使用它?看起来这只会给标题一个像素。高度计算是否可能为table.getRowHeight()*(行+1)?这不考虑L&F的各个方面。如果在
    滚动窗格中可以看到滚动条,则会将表格列从其首选大小挤压出来。它还假设页眉高度等于行高,但情况并非总是如此。我也有类似的问题,这个解决方案帮助了我,而不是首选的解决方案。