JTable和JScrollPane大小的问题

3
我有一个包含JTableJScrollPane。初始时,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

嗯,myTable.setFillsViewportHeight(true/false); - mKorbel
2个回答

2

BoxLayout可以让组件增长到其最大尺寸。我猜你需要重写滚动窗格的getMaximumSize()方法,以返回首选大小。

当添加一行时,我使用命令"((JComponent)scrollPane.getParent()).revalidate();"滚动窗格会随着jtable一起增长。

那有点违背了滚动窗格的作用。滚动条应该保持固定大小,只有在必要时才会出现滚动条。


1
我遇到了类似的问题 - 基本上我想要一个带有最小和最大尺寸的滚动窗格中的 JTable:当表中没有数据时,它应该显示一个一行高度的面板背景(显然不是假行),而当超过 10 行时,限制显示的表格大小为这些 10 行加上滚动条。1 到 10 之间的任何大小都应以完整高度显示表格。这种情况是父子表格,这是子表格,因此我必须根据单击哪个父表格行来触发子表格调整大小。固定的窗格大小看起来很丑,因为它占用了不必要的空间,将其他可能可视信息推出子表格的视野,只留下空白空间。
在使用子行更新模型后(当然还要使用 setFillsViewportHeight(true)),使用 setPreferredScrollableViewportSize 几乎给了我所需的一切。除了视口不会重新绘制,直到我点击它或从窗口中取得焦点然后再次返回,这非常令人恼火。
阅读了这篇文章后,解决方案变得超级简单:我只需要在滚动窗格的父级上调用revalidate,就像解决方案中指出的那样。 它完美地解决了问题。 大多数情况下,我只是想分享一个使用案例,在这种情况下,您希望滚动窗格的大小可以动态更改达到最大尺寸。 如果所有东西都以固定大小创建,Swing会简单得多...与我遇到的几乎所有现实用例都不同 :-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接