【问题标题】:Resize JScrollPane client without scrollbars rolling在不滚动滚动条的情况下调整 JScrollPane 客户端的大小
【发布时间】:2009-12-14 15:13:05
【问题描述】:

我有一个 JScrollpane,其中包含一个可滚动客户端,可在使用应用程序时动态更改其大小。我希望 JScrollPane 能够在客户端大小更改时知道更改而不移动视口

澄清我的意思: 请参阅 Sun 的文章如何使用滚动窗格中的 Java Webstart 示例 ScrollDemo2。单击窗口底部时,窗口部分会出现一个圆圈,并且滚动条会移动。这是我想避免的后一种行为。

我的猜测是,这只是在滚动窗格解决方案中涉及的众多组件之一中设置一个简单标志的问题,但我就是找不到它在哪里。有人知道吗?

【问题讨论】:

    标签: java swing client size jscrollpane


    【解决方案1】:

    我设法通过覆盖 JScrollPane 中视口的标准行为来解决这个问题。这可能是一个不适合所有人的解决方案,但在我的 GUI 中,这就像一个魅力。

    JScrollPane pane = new JScrollPane();
    pane.setViewport(
      new JViewport(){
        /**
         * An empty override implementation to prevent undesired scrolling on
         * size changes of the client.
         */
         @Override
         public void scrollRectToVisible(Rectangle rect){}
      });
    

    【讨论】:

      【解决方案2】:

      我会尝试类似:

      Point p = scrollPane.getViewport().getViewportPosition();
      revalidate();
      scrollPane.getViewport().setViewportPosition(p);
      

      您可能需要将最后一行代码包装在 SwingUtilities.invokeLater 中。

      如果这不起作用,那么也许您可以在 revalidate() 之前和之后禁用/启用视口?

      【讨论】:

      • 这可能在某些情况下有效,但在我的情况下,问题是包含我的 JScrollPane 的类的 JScrollPane 不知道客户端的大小变化。这意味着我无法到达发生更改的滚动窗格。至少不是没有在层次结构中向上搜索它,这是我想避免的。此外,我真的认为有一个简单直接的解决方案,但我只是不知道它:)。
      • 在示例中,您引用的解决方案是简单地删除 scrollRectToVisible() 方法。否则,向上搜索很容易,因为面板将添加到视口中,因此您只需要获取要更改首选大小的面板的父级即可。我注意到,当您将 JTextArea 添加到滚动窗格上的面板时,视口往往会滚动到文本区域。除非您发布显示真正问题的 SSCCE,否则我不知道我们还能提供什么帮助。
      • 我看到 ScrollDemo2 是一个不幸的例子。正如您所指出的,该行为是使用 scrollRectToVisible() 方法显式设置的。不幸的是,很难为我的问题提供一个 SSCCEE,因为它是一个相当大而复杂的 GUI 的一部分。很可能,问题是因为我在许多嵌套组件类之一中做了一些愚蠢的事情。但是,无论如何,您的帖子还是为我指明了正确的方向,并帮助我解决了问题。我在下面发布解决方案。
      猜你喜欢
      • 2018-05-11
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2019-04-07
      相关资源
      最近更新 更多