布局管理器区域的动态调整大小

4
在哪种Swing布局管理器中可以通过编程方式更改布局区域?如何以最低的成本实现这一点?
我必须创建一个具有类似于JSplitPane但由三个面板组成的功能的组件。其中一个要点是在单击分隔符上的oneTouchExpandable按钮后展开/折叠其中一个面板。但问题是我不知道如何实现此折叠操作。我尝试将面板宽度设置为0,但包含此面板的布局区域在组件之后不会缩小。我尝试在所有布局管理器中执行此操作,但效果相同。
谢谢。
4个回答

4

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

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

4

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

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

一旦您更改了大小属性,您必须在容器上调用 revalidate() ,然后您应该能够看到变化。


2

我同意使用revalidate()/preferredSize方法,但想建议一下:不要重复造轮子!可以使用JideSplitPane(JIDE的免费“Common Layer”之一) - 它支持多个分割。


是的,我查看了这种方法并准备使用它,但它不允许在面板之间进行分隔符操作,而我需要模拟JSplitPane行为,并使用OneTouchExpandable按钮等等。但是对于不需要控制分隔符的任何人来说,它可能是一个很好的解决方案。 - Maksym Govorischev
不太确定您所说的“它不允许操作...”是什么意思。它的表现就像标准的分割窗格一样,并且甚至还内置了一键展开功能... - CarlG
请问您能否指出一个确切的位置,解释一下这种方法的可扩展功能是如何实现的?非常感谢。 - Maksym Govorischev
当然,在javadocs中有相关内容。请参见http://www.jidesoft.com/javadoc/com/jidesoft/swing/JideSplitPane.html#setOneTouchExpandable(boolean)。 - CarlG

1

感谢所有人的回答。最终,我结合了几个答案的解决方案。

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

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

刷新使用以下代码片段完成: container.setVisible(false); container.revalidate(); container.repaint(); container.setVisible(true);

我想把这段代码放在某个地方供其他人使用,但不知道具体在哪里。如果您知道这样的地方,请在评论中指出。


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