【问题标题】:Dynamic resize of Layout Manager areas布局管理器区域的动态调整大小
【发布时间】:2010-11-29 04:12:30
【问题描述】:

可以在哪个 Swing 布局管理器中以编程方式更改布局区域?以及如何以最低的成本做到这一点?

我必须从头开始创建功能类似于 JSplitPane 但具有三个面板的组件。其中一个时刻是在单击分隔板上的 oneTouchExpandable 按钮后展开/折叠其中一个面板。但问题是我不知道如何实现这个折叠动作。我尝试将面板宽度设置为 0,但包含此面板的布局区域不会在组件之后缩小。我尝试在所有布局管理器中都这样做,但效果是一样的。

谢谢。

【问题讨论】:

    标签: java swing layout resize


    【解决方案1】:

    所有布局管理器都会动态调整大小。但是,宽度和高度属性是布局的结果,将被覆盖。

    您应该查看的属性是 preferredSize, minimumSizemaximumSize - 布局管理器基于这些属性进行计算,尽管确切的效果取决于布局管理器(例如 BorderLayout 将给出 NORTH、SOUTH、WEST 和EAST 组件的首选大小(如果可能)并将其余部分分配给 CENTER 组件)。

    更改大小属性后,您必须在容器上调用revalidate(),然后您应该会看到更改。

    【讨论】:

      【解决方案2】:

      在 GUI 可见后进行影响面板布局的更改时,您需要 revalidate() 面板,这实际上会调用面板上的布局。在您的情况下,简单地使组件不可见可能更容易:

      component.setVisible(false);
      panel.revalidate();
      panel.repaint(); // this is only required sometimes
      

      【讨论】:

        【解决方案3】:

        我同意 revalidate()/preferredSize 的答案,但只是想提出这个建议:不要重新发明轮子!使用 JideSplitPane(JIDE 的免费“公共层”的一部分)——它支持两个以上的拆分。

        【讨论】:

        • 是的,我查看了这种方法并准备使用它,但它不允许在面板之间使用分隔符进行操作,并且我需要使用 OneTouchExpandable 按钮等模拟 JSplitPane 行为。但对于不需要控制分隔线的人来说,这可能是一个很好的解决方案
        • 不太清楚您所说的“它不允许操作...”是什么意思。它的作用与标准的拆分窗格完全一样,它甚至还具有内置的一键式可扩展功能...跨度>
        • 你能指出我解释这种方法的一键式可扩展功能的确切位置吗?提前谢谢你。
        • 当然,它在 javadocs 中。见jidesoft.com/javadoc/com/jidesoft/swing/…
        【解决方案4】:

        感谢大家的回答。最后我结合了几个答案的解决方案。

        我的最终解决方案如下: 我使用 BorderLayout,设置 West、Center 和 East 面板,然后通过将 PreferredSize 设置为 West 和 East 面板来操纵它们的大小。渲染方案如下:在布局组件时,BorderLayout 为东面板和西面板提供了它们的 PreferredSize,其余空间为 Center 面板。因此,通过一些简单的计算,我可以轻松地操纵三个面板中每一个的大小。

        我还向西面板和东面板添加了分隔线(最初只是具有固定大小的 JPanel 组件)(在计算时也考虑了它们的大小)。对于动态调整大小,我处理此分隔器上的拖动事件并重新计算面板大小。

        使用以下 sn-p 完成刷新: 容器.setVisible(false); 容器.重新验证(); container.repaint(); 容器.setVisible(true);

        我想将此代码放在某个地方以供其他人使用,但不知道具体在哪里执行此操作。因此,如果您知道这样的地方,请在 cmets 中指出我。

        【讨论】:

          猜你喜欢
          • 2011-11-20
          • 2012-11-25
          • 1970-01-01
          • 1970-01-01
          • 2017-07-16
          • 2012-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多