【发布时间】:2011-06-29 16:24:58
【问题描述】:
我目前将 JTables 嵌套在 JScrollPanes 中,如下所示:
我的问题是每个表中的行数在创建表时是可变的。如果表格太短,我想要做的是使 JScrollpane 更小,但如果表格太长,我想将其保持在设定的大小。
我怎样才能做到这一点?
【问题讨论】:
-
+1 为屏幕截图。如果有图片,回答这类问题会容易得多。
标签: java swing jtable jscrollpane
我目前将 JTables 嵌套在 JScrollPanes 中,如下所示:
我的问题是每个表中的行数在创建表时是可变的。如果表格太短,我想要做的是使 JScrollpane 更小,但如果表格太长,我想将其保持在设定的大小。
我怎样才能做到这一点?
【问题讨论】:
标签: java swing jtable jscrollpane
Dimension d = table.getPreferredSize();
scrollPane.setPreferredSize(
new Dimension(d.width,table.getRowHeight()*rows+1));
其中rows代表数据的行数,也就是限制。
【讨论】:
scrollPane 中可见,它将从首选大小压缩表格列。它还假设标题高度等于行高,但情况并非总是如此。
以下(当前接受的)代码不考虑了外观的各个方面:
Dimension d = table.getPreferredSize();
scrollPane.setPreferredSize(
new Dimension( d.width, table.getRowHeight() * (rows+1) ));
table.getRowHeight() 像素。 (在“金属”L&F 中,它更高)scrollPane 中的垂直滚动条会将表格压扁,使其小于其首选大小。rows 行都可见。应使用以下代码:
table.setPreferredScrollableViewportSize(
new Dimension(
table.getPreferredSize().width,
table.getRowHeight() * visible_rows));
scrollPane 将询问表格的首选大小,并为标题和滚动条添加任何额外空间。
当visible_rows 从4 减少到3 时,下面显示了具有4 行的JTable 的差异。 JScrollPane 的首选宽度会自动填充以包含滚动条,而不是压缩表格列。另请注意,还会自动提供标题空间(与行高不同);它不包含在visible_rows 计数中。
【讨论】:
我在此上下文中使用setPreferredScrollableViewportSize(),然后根据需要使用pack() 或revalidate()。
附录:
你如何使用它?
这是Scrollable 在JTable 中实现的一个特性。这里有几个examples。补充的getPreferredScrollableViewportSize() 也可能有用。
【讨论】:
使用 GridBagLayout 管理器并将 JScrollPane 的最大大小设置为您想要的任何值。如果表较大,JScroll 不会超过该大小。
然后,添加一个胶水组件(我认为它类似于 BoxLayout.createVerticalGlue 或类似的东西),它是一个只占用剩余空间的空组件。
因此,当表格较小时,该组件将占用剩余空间,如果表格较大,则不会占用任何空间,因为 JScrollPane 正在使用它。
【讨论】:
如果使用 MigLayout,在添加包含 JTable 的滚动窗格时,可以指定约束 growx 而不是 grow,使其仅水平拉伸。
现在滚动窗格位于其父级的中间。您可以在行约束中设置以使其与行的top 对齐。或者,在组件约束中:aligny top。
【讨论】: