我有一个包含
现在开始可以正常工作了。 但是当向jtable添加一行并在jpanel(滚动面板的父容器)上调用revalidate()时,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...
JTable
的JScrollPane
。初始时,JTable
有3行,之后会添加更多行。
默认情况下,我的3行JTable
很丑,因为JScrollPane
从客户端(JTable
)调用getPreferredScrollableViewportSize
,而返回值始终相同。这就是为什么我的JTable
/JScrollPane
有这个空白区域,JScrollPane和
JTable大小不一致。
我的解决方案是创建一个子类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添加一行并在jpanel(滚动面板的父容器)上调用revalidate()时,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());
这样我避免了getViewportBorderBounds().getHeight()
的奇怪返回值。
Wolfgang