java - swing详解 - 将JScroll窗格缩小为与JTable相同的高度




jtable用法 (4)

使用GridBagLayout管理器,并将JScrollPane的最大尺寸设置为任何你想要的。 如果表格较大,则JScroll将不会增长超过该大小。

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

所以,当表格变小的时候,这个组件将会占用剩余的空间,如果表格比较大的话,JScrollPane会使用它,所以不会占用任何东西。

我目前有JTables嵌套在JScrollPanes像这样:

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

我怎样才能做到这一点?


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

其中rows代表数据的行数或限制。


在这种情况下,我使用setPreferredScrollableViewportSize() ,然后根据需要使用pack()revalidate()

附录:

你如何使用它?

这是JTableScrollable实现的一个特性。 这里有几个例子 。 互补的getPreferredScrollableViewportSize()也可能是有用的。


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

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

应该使用下面的代码:

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

scrollPane会询问表的首选大小,并为表头和滚动条添加额外的空间。

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





jscrollpane