我有一个JScrollPane
,其中包含JTable
。在JTable
我最初有3行。后来行添加。
我的3行的默认JTable
很难看,因为JScrollPane
从客户端调用getPreferredScrollableViewportSize
(JTable
)并且返回值始终相同。这就是为什么我的JTable
/ JScrollpane
有3行有这个空闲空间的原因,JScrollpane and
JTable的大小不同。
我的解决方案是创建一个子类JTabl
e,覆盖getPreferredScrollableViewportSize
并返回此函数getPreferredSize();
。现在整个JScrollPane
的大小与3行`JTable!
添加行时,我有((JComponent) scrollPane.getParent()).revalidate();
滚动窗格随桌子而增长。
一切正常!
但是现在我想为scrollpane(面板)的容器设置一个特定的布局:
myjpanel.setLayout (new BoxLayout(contentPane, BoxLayout.Y_AXIS));
当我添加此命令时,我的整个解决方案不再起作用。 滚动窗格没有3行表的大小,这个可用空间再次出现。
为什么会这样?
有人有解决方案吗?
续
感谢camickr指出我正确的方向。我的解决方案如下:
scrollPane = new JScrollPane (table) {
public Dimension getMaximumSize () {
double height = 0;
double width = super.getMaximumSize().getWidth();
height += columnHeader.getViewSize().getHeight();
height += viewport.getView().getPreferredSize().getHeight();
height += (getViewportBorderBounds().getHeight() * -1);
Dimension returnValue = new Dimension ((int) width, (int) height);
return returnValue;
}
};
现在开始工作。 但是当一行被添加到jtable并且我调用revalidate();在jpanel(scrollpanel的父容器)上,jscrollpanel的高度缩小为1行+标题! 有没有人知道在这种情况下该做什么。
续
现在我知道了这个问题。它是viewportBorder。为了获得整体的精确高度,我必须总计视图的高度(Jtable),列标题的高度和viewportBorder的高度。第一次getViewportBorderBounds().getHeight()
返回-3,下次 - 在表模型中插入新行后 - 函数返回48.我不明白为什么此函数现在返回48。
另一点是,camickr说改变jscrollpane的大小会破坏滚动窗格的目的。我不明白。任何人都可以满足于默认的jscrollpane大小450 x 400(http://www.javalobby.org/java/forums/t19559.html),即使jtable在开头只有3行。这个未填充的额外空间在我眼中看起来不太专业。有谁有更好的解决方案。
非常感谢您的回答
续表
现在一切正常!
一开始我只是将jscrollpane边框设置为0 ... sp.setBorder(createEmptyBorder());
通过这种方式,我避免使用getViewportBorderBounds().getHeight()
这些奇怪的返回值
沃尔夫冈
答案 0 :(得分:2)
BoxLayout允许组件增长到组件的最大大小。我想你需要覆盖滚动窗格的getMaximumSize()来返回首选大小。
当添加一行时,我有命令“((JComponent)scrollPane.getParent())。revalidate();”滚动窗格随着jtable一起增长。
这种方式违背了滚动条的目的。滚动条应保持固定大小,然后在必要时显示滚动条。
答案 1 :(得分:1)
我遇到了类似的问题 - 基本结果是我想要一个具有最小和最大尺寸的滚动窗格中的JTable:当表中没有数据时,它应该有一行高的窗格背景显示(显然不是假行),当它超过10行时,将显示的表大小限制为10行加上滚动条。 1到10之间的任何大小都应该以全高显示表格。情况是父子表,这是子表,因此我必须根据单击哪个父表行来触发子表调整大小。固定的窗格大小看起来很丑陋,因为它占用了不必要的空间,只需要空格就可以将子表下的其他可能可见的信息推出视图。
在用子行更新模型后使用setPreferredScrollableViewportSize(当然还有setFillsViewportHeight(true))给了我几乎所需的一切。除非在我点击它之前视口不会重绘,或者从窗口获取焦点然后向后弹回,这是最令人讨厌的。
阅读这篇文章后,解决方案非常简单:我只需要在滚动窗格的父级上调用revalidate,正如解决方案中所指出的那样。完美修复了它。大多数情况下,我只是想分享一个用例,你希望滚动窗格大小动态地改变最大最大尺寸。如果所有东西都是永久固定的,那么Swing就会简单得多......不像我遇到过的每一个真实用例: - )