固定宽度,JPanel中带有流量的可变高度

我对Java的布局管理器有一个恼人的问题。 我有以下情况:在面板A中是另外两个具有绝对布局的面板B和具有FlowLayout的C. B是高度自定义的,并通过setPreferredSize设置固定大小。 C应具有与B相同的固定宽度,但是具有可变高度,具体取决于流中添加的组件数量。 结果A应该具有固定的宽度和A.height + B.height作为高度 – 至少这是我想要的。

然而,我得到的是面板A的宽度根本不固定(即使我设置了它的首选尺寸),面板C中的内容不是自动换行,而是以长行显示。 当然这也使得B具有比它应该更大的宽度。

我该怎么做才能解决这个问题? 有没有更好的布局,还是我必须模仿所有使用绝对布局?

 import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JPanel; public class Test extends JPanel { public Test () { this.setLayout( new BoxLayout( this, BoxLayout.Y_AXIS ) ); JPanel top = new JPanel( null ); top.setBackground( Color.GREEN ); top.setPreferredSize( new Dimension( 200, 20 ) ); JPanel flowPanel = new JPanel( new FlowLayout( FlowLayout.LEFT, 2, 2 ) ); this.add( top ); this.add( flowPanel ); flowPanel.add( new JButton( "x" ) ); flowPanel.add( new JButton( "x" ) ); flowPanel.add( new JButton( "x" ) ); flowPanel.add( new JButton( "x" ) ); flowPanel.add( new JButton( "x" ) ); flowPanel.add( new JButton( "x" ) ); flowPanel.add( new JButton( "x" ) ); flowPanel.add( new JButton( "x" ) ); flowPanel.add( new JButton( "x" ) ); flowPanel.add( new JButton( "x" ) ); flowPanel.add( new JButton( "x" ) ); flowPanel.add( new JButton( "x" ) ); } } 

换行布局应该有所帮助。

提供所需的高级视图配置的最佳方法是通过强大的GridBagLayoutManager替换FlowLayout 。 值得注意的是,当使用流畅的子类(如GBC)时,通常由GridBagConstraints表达的约束更容易理解。

最后,像往常一样,你应该考虑看一下Swing教程 。

  1. 您不应该直接将子项添加到框架中。 始终添加到contentPane – > this.getContentPage().add(...)

  2. 要使布局正常工作,请在内容页面中放置带有GridBagLayout的JPanel,并使该面板填充内容页面。

  3. 给GridBagLayout 2列。

现在您无法禁用窗口的水平resize,因此您必须找到另一种方法来处理额外的空间。 我建议给第一列固定宽度(设置fill=NONE ),让面板C填充剩余空间。

如果将面板B所有尺寸(最小值,最大值,首选尺寸)设置为首选尺寸,则不应再更改尺寸。

提示:如果Swing布局不起作用,请将其嵌套在另一个布局中。

您放入BorderLayout的LINE_END或LINE_START部分的所有内容都将保持其宽度不变:如果容器resize,则仅调整高度

NORTH和SOUTH是宽度可变的

CENTER是宽度和高度可变的

LINE_START和LINE_END只是高度变量

所以,我建议你将’C’容器放在这种BorderLayout区域

Interesting Posts