在哪个Swing布局管理器中,可以通过编程方式更改布局区域?如何以最低的成本实现这一目标?
我必须创建具有类似于JSplitPane的功能的组件,但是从头开始有三个面板。其中一个时刻是在分割器上单击oneTouchExpandable按钮后展开/折叠其中一个面板。但问题是我不知道如何实现这种崩溃行为。我尝试将面板宽度设置为0,但包含此面板的布局区域在组件后不会缩小。我尝试在所有布局管理器中执行此操作,但效果是相同的。
感谢。
答案 0 :(得分:4)
所有布局管理器动态调整大小。但是,width和height属性是布局的结果,将被覆盖。
您应该查看的属性是preferredSize, minimumSize
和maximumSize
- 布局管理器根据这些属性进行计算,但确切的效果取决于布局管理器(例如BorderLayout将给出NORTH,如果可能的话,南,西和东组成他们的首选大小,并将余数分配给CENTER组件。
更改尺寸属性后,您必须在容器上调用revalidate()
,然后您才能看到更改。
答案 1 :(得分:3)
在GUI可见后进行影响面板布局的更改时,您需要重新验证()面板,该面板基本上调用面板上的布局。在您的情况下,简单地使组件不可见可能更容易:
component.setVisible(false);
panel.revalidate();
panel.repaint(); // this is only required sometimes
答案 2 :(得分:2)
我正在使用revalidate()/ preferredSize答案,但只是想建议一下:不要重新发明轮子!使用JideSplitPane(JIDE的免费“公共图层”的一部分) - 它支持两个以上的分割。
答案 3 :(得分:1)
感谢大家的回答。最后,我最终结合了几个答案的解决方案。
我的最终解决方案如下: 我使用BorderLayout,设置West,Center和East面板,然后通过将PreferredSize设置为West和East面板来操纵它们的大小。渲染方案如下:在布局组件时,BorderLayout为East和West面板提供其PreferredSize和其余空间到Center面板。因此,通过一些简单的计算,我可以无痛地操纵三个面板中的每一个的尺寸。
我还在西部和东部面板中添加了分隔符(最初只是具有固定大小的JPanel组件)(在计算时也考虑了它们的大小)。对于动态调整大小,我处理在此分隔符上拖动事件并重新计算面板大小。
使用以下代码段完成刷新: container.setVisible(假); container.revalidate(); container.repaint(); container.setVisible(真);
我想把这段代码放在某个地方可供其他人使用,但不知道到底要做什么。所以,如果您知道这样的地方,请在评论中指出。