问题描述
|
我有一个
JScrollPane
和JTable
。在ѭ1中,我最初有3行。稍后添加行。
我的3行的默认值JTable
很丑,因为JScrollPane
从客户端(JTable
)调用getPreferredScrollableViewportSize
,并且返回值始终相同。这就是为什么我的具有3行的JTable
/JScrollpane
具有此可用空间的原因,JScrollpane and
JTable没有相同的大小。
我的解决方案是使子类JTabl
e,重写getPreferredScrollableViewportSize
,并返回此函数getPreferredSize();
。现在整个ѭ0恰好具有三行JTable的大小!
当添加一行时,我有命令((JComponent) scrollPane.getParent()).revalidate();
滚动窗格与表格一起增长。
一切正常!
但是现在我想为滚动面板(面板)的容器设置某种布局:
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(滚动面板的父容器)上,jscrollpanel的高度缩小到1行+标头!
有谁知道在这种情况下该怎么办。
继续
现在我知道了问题所在。它是viewportBorder。为了得到整体,确切的高度我必须将视图的高度(Jtable),列标题的高度和viewportBorder的高度相加。 getViewportBorderBounds().getHeight()
第一次返回-3,下次-在表模型中插入新行之后-函数返回48。我不明白为什么该函数现在返回48。
还有一点是,camickr说更改jscrollpane的大小会破坏滚动窗格的目的。我不明白。即使jtable的开头只有3行,对于jscrollpane的默认大小为450 x 400(http://www.javalobby.org/java/forums/t19559.html),任何人都无法满意。在我眼中,这个空缺的多余空间看起来并不专业。有谁对此有更好的解决方案。
非常感谢您的回答
继续
现在一切正常!
一开始,我只是将jscrollpane边框设置为0 ...sp.setBorder(createEmptyBorder());
这样我就避免了这些奇怪的返回值of17ѭ
沃尔夫冈
解决方法
BoxLayout允许组件增长到组件的最大大小。我想您需要重写滚动窗格的getMaximumSize()以返回首选大小。
当添加一行时,我有命令\“(((JComponent)scrollPane.getParent())。revalidate(); \”滚动窗格与jtable一起增长。
这种破坏了滚动面板的目的。滚动条应该保持固定大小,然后在必要时会出现滚动条。
, 我有一个类似的问题-基本结果是我希望滚动窗格中的JTable具有最小和最大大小:当表中没有数据时,它应该显示一个单行高度的窗格背景(不是显然是假行),并且当它超过10行时,将显示的表大小限制为那10行加滚动条。 1到10之间的任何大小都应以完整高度显示表格。这种情况是一个父子表,而这就是子表,所以我不得不根据单击哪个父表行来触发子表的大小调整。固定的窗格大小看起来很丑陋,因为它占用了不必要的空间来将子表下的其他可能可见的信息推送到视线之外,而只有空白。
在使用子行更新模型后使用setPreferredScrollableViewportSize(当然还有setFillsViewportHeight(true))给了我几乎所有我需要的东西。除了在我单击视口或从窗口获取焦点然后向后滑动视口之前不会重新绘制视口之外,这非常令人讨厌。
阅读这篇文章后,解决方案非常简单:正如解决方案中指出的那样,我只需要在滚动窗格的父级上调用revalidate即可。完美修复。通常,我只是想分享一个用例,在该用例中,您希望滚动窗格的大小动态更改为最大大小。如果所有内容都是永久固定大小的,则摆动会非常简单...与我所遇到的几乎每个现实生活用例都不一样:-)