我有一个JScrollPane
with a JTable
在里面。在里面JTable
我最初有 3 行。稍后添加行。
默认JTable
我的 3 行很难看,因为JScrollPane
calls getPreferredScrollableViewportSize
来自客户端(JTable
) 并且返回值始终相同。这就是为什么我的JTable
/JScrollpane
3 行有这个可用空间,JScrollpane and
JTable 没有相同的大小。
我的解决方案是创建一个子类JTabl
e、覆盖getPreferredScrollableViewportSize
并在这个函数中返回getPreferredSize();
。现在整个JScrollPane
与 3 行“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 行 + 标题!
有谁知道在这种情况下该怎么办。
继续
现在我知道问题所在了。它是视口边框。为了获得完整、准确的高度,我必须将视图 (Jtable) 的高度、列标题的高度和 viewportBorder 的高度相加。第一次getViewportBorderBounds().getHeight()
返回 -3,下次 - 在表模型中插入新行之后 - 该函数返回 48。我不明白为什么这个函数现在返回 48。
另一点是camickr说改变jscrollpane的大小违背了scrollpane的目的。我不明白。即使 jtable 开头只有 3 行,怎么会有人对 450 x 400 (http://www.javalobby.org/java/forums/t19559.html) 的默认 jscrollpane 大小感到满意。这个未填充的额外空间在我看来看起来不太专业。有没有人对此有更好的解决方案。
非常感谢您的回答
继续
现在一切正常了!
一开始我只是将 jscrollpane 边框设置为 0 ...sp.setBorder(createEmptyBorder());
通过这种方式,我避免了这些奇怪的返回值getViewportBorderBounds().getHeight()
沃尔夫冈