【发布时间】:2011-09-08 05:41:51
【问题描述】:
我有一个JScrollPane,里面有一个JTable。在JTable 中,我最初有 3 行。稍后会添加行。
我的 3 行的默认 JTable 很难看,因为 JScrollPane 从客户端 (JTable) 调用 getPreferredScrollableViewportSize 并且返回值始终相同。这就是为什么我的JTable/JScrollpane 3 行有这个空闲空间,JScrollpane andJTable 没有相同的大小。
我的解决方案是创建一个子类JTable,覆盖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 的大小会破坏滚动窗格的目的。我不明白这个。即使 jtable 开头只有 3 行,任何人都对 450 x 400 (http://www.javalobby.org/java/forums/t19559.html) 的默认 jscrollpane 大小感到满意。在我看来,这个未填充的额外空间看起来并不专业。有没有人对此有更好的解决方案。
非常感谢您的回答
续
现在一切正常!
一开始我只是将 jscrollpane 边框设置为 0 ...sp.setBorder(createEmptyBorder());
这样我就避免了getViewportBorderBounds().getHeight()这些奇怪的返回值
沃尔夫冈
【问题讨论】:
-
hmmm myTable.setFillsViewportHeight(true/false);