【问题标题】:Problems with JTable and JScrollpane sizeJTable 和 JScrollpane 大小的问题
【发布时间】: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);

标签: java swing jtable


【解决方案1】:

BoxLayout 允许组件增长到组件的最大尺寸。我想您需要覆盖滚动窗格的 getMaximumSize() 以返回首选大小。

添加一行时,我有命令“((JComponent) scrollPane.getParent()).revalidate();”滚动窗格随 jtable 一起增长。

这种方式违背了滚动窗格的目的。滚动条应该保持固定大小,然后在必要时会出现滚动条。

【讨论】:

    【解决方案2】:

    我有一个类似的问题 - 基本结果是我希望滚动窗格中的 JTable 具有最小和最大大小:当表中没有数据时,它应该有一个单行高的窗格背景显示(显然不是假行),当超过 10 行时,将显示的表格大小限制为这 10 行加上滚动条。 1 到 10 之间的任何大小都应以全高显示表格。情况是父子表,这是子表,所以我不得不根据点击的父表行触发子表resize。固定的窗格大小看起来很难看,因为它占用了不必要的空间来将子表下的其他可能可见的信息推到视图之外,而只有空白空间。

    在使用子行更新模型后使用 setPreferredScrollableViewportSize(当然还有 setFillsViewportHeight(true))给了我几乎所有我需要的东西。除了视口在我单击它之前不会重绘,或者从窗口中获得焦点然后轻弹回来,这是最烦人的。

    阅读这篇文章后,解决方案非常简单:我只需要在滚动窗格的父级上调用 revalidate,正如解决方案中所指出的那样。完美修复它。大多数情况下,我只是想分享一个用例,您希望滚动窗格大小动态更改达到最大尺寸。如果一切都永远以固定大小创建,Swing 就会简单得多......不像我遇到的几乎所有现实生活中的用例:-)

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 2017-12-28
      • 1970-01-01
      相关资源
      最近更新 更多