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

时间:2011-06-29 16:24:58

标签: java swing jtable jscrollpane

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

enter image description here

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

我该如何做到这一点?

5 个答案:

答案 0 :(得分:19)

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

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

答案 1 :(得分:6)

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

附录:

  

你如何使用它?

这是JTableScrollable的实施功能。这里有几个examples。补充getPreferredScrollableViewportSize()也可能有用。

答案 2 :(得分:2)

使用GridBagLayout管理器并将JScrollPane的最大大小设置为您想要的任何值。如果表格较大,则JScroll不会超出该大小。

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

因此,当表格较小时,此组件将占用剩余空间,如果表格较大,则自JScrollPane使用它以后不会采取任何操作。

答案 3 :(得分:1)

以下(目前接受的)代码确实考虑了外观的各个方面:

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

    table.setPreferredScrollableViewportSize(
        new Dimension(
            table.getPreferredSize().width,
            table.getRowHeight() * visible_rows));
    

    scrollPane将询问表格的首选大小,并为标题和滚动条增加任何额外空间。

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

    JTable with and without scrollbar

答案 4 :(得分:0)

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

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