我必须创建一个具有类似于JSplitPane但由三个面板组成的功能的组件。其中一个要点是在单击分隔符上的oneTouchExpandable按钮后展开/折叠其中一个面板。但问题是我不知道如何实现此折叠操作。我尝试将面板宽度设置为0,但包含此面板的布局区域在组件之后不会缩小。我尝试在所有布局管理器中执行此操作,但效果相同。
谢谢。
当您在GUI可见后进行影响面板布局的更改时,需要重新验证(revalidate())面板,这将在面板上调用布局。在您的情况下,简单地使组件不可见可能更容易:
component.setVisible(false);
panel.revalidate();
panel.repaint(); // this is only required sometimes
所有布局管理器都是动态调整大小的。然而,宽度和高度属性是布局的结果,并且会被覆盖。
您应该查看的属性是 preferredSize, minimumSize
和 maximumSize
- 布局管理器基于这些属性进行计算,但具体效果取决于布局管理器(例如,BorderLayout将尽可能给NORTH、SOUTH、WEST和EAST组件分配其首选大小,并将剩余空间分配给CENTER组件)。
一旦您更改了大小属性,您必须在容器上调用 revalidate()
,然后您应该能够看到变化。
我同意使用revalidate()/preferredSize方法,但想建议一下:不要重复造轮子!可以使用JideSplitPane(JIDE的免费“Common Layer”之一) - 它支持多个分割。
感谢所有人的回答。最终,我结合了几个答案的解决方案。
我的最终解决方案如下: 我使用BorderLayout,设置West、Center和East面板,然后通过将West和East面板的PreferredSize设置为操作它们的大小。渲染方案如下:在布置组件时,BorderLayout会给East和West面板分配它们的PreferredSize,并将其余空间分配给中心面板。因此,通过一些简单的计算,我可以轻松地操纵三个面板的大小。
我还向West和East面板添加了分隔符(最初只是具有固定大小的JPanel组件)(在计算时也考虑了它们的大小)。对于动态调整大小,我处理这些分隔符上的拖动事件并重新计算面板大小。
刷新使用以下代码片段完成: container.setVisible(false); container.revalidate(); container.repaint(); container.setVisible(true);
我想把这段代码放在某个地方供其他人使用,但不知道具体在哪里。如果您知道这样的地方,请在评论中指出。