2009-09-17 77 views
4

在哪个Swing布局管理器中,可以通过编程方式更改布局区域?以及如何以最低的成本做到这一点?布局管理器区域的动态调整大小

我必须创建具有与JSplitPane类似功能的组件,但需要从头开始创建三个面板。其中一个时刻是点击分隔线上的oneTouchExpandable按钮后展开/折叠其中一个面板。但问题是,我不知道如何实施这一崩溃行动。我试着将面板宽度设置为0,但包含此面板的布局区域在组件后不收缩。我试图在所有布局管理器中执行此操作,但效果相同。

谢谢。

回答

1

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

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

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

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

我想把这段代码放到别处可用,但不知道在哪里可以做到这一点。所以如果你知道这样的地方,请在评论中指向我。

4

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

你应该看看属性的是preferredSize, minimumSize,并且maximumSize - 布局管理立足于这些属性他们的计算,但具体效果取决于布局管理器(如BorderLayout这将给北,南,西,东部件的首选大小如果possibe并将其余部分分配给CENTER组件)。

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

3

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

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

我与重新验证()/首选大小的答案,但只是想表明这一点:不要重新发明轮子!使用JIDESplitPane(JIDE的免费“公共层”的一部分) - 它支持两个以上的分割。

+0

是的,我看了这个方法并准备好使用它,但它不允许在面板之间使用分隔线进行操作,我需要使用OneTouchExpandable按钮来模拟JSplitPane行为等等。但对于任何不需要控制分频器的人来说,这可能是一个很好的解决方案 – 2009-10-05 14:04:37

+0

不太清楚你的意思是“它不是合法的操纵......”它的行为完全像标准的分割窗格,它甚至有一个触摸可扩展功能内置在... – CarlG 2009-10-05 15:54:54

+0

您能否指出我对此方法的一键式可扩展功能进行了解释的确切位置?先谢谢你。 – 2009-10-12 11:27:51