我对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" ) );
}
}
答案 0 :(得分:10)
Wrap Layout应该有帮助。
答案 1 :(得分:0)
提供所需高级视图配置的最佳方式是使用功能强大的GridBagLayoutManager替换FlowLayout
。值得注意的是,在使用流畅的子类(如GridBagConstraints)时,通常由GBC表示的约束更容易理解。
最后,与往常一样,您应该考虑查看Swing tutorial。
答案 2 :(得分:0)
您不应直接向框架添加子项。始终添加到contentPane
- > this.getContentPage().add(...)
要使您的布局有效,请在内容页面中放置一个带有GridBagLayout的JPanel,并使该面板填充内容页面。
给GridBagLayout 2列。
现在您无法禁用窗口的水平调整大小,因此您必须找到另一种方法来处理额外的空间。我建议给第一列固定宽度(设置fill=NONE
),让面板 C 填充剩余空间。
如果将面板B
的所有尺寸(最小,最大,首选)设置为首选尺寸,则不应再更改尺寸。
提示:如果Swing布局不起作用,请将其嵌套在另一个布局中。
答案 3 :(得分:0)
您放入BorderLayout的LINE_END或LINE_START部分的所有内容都会保持其宽度不变:如果调整容器大小,则只调整高度
NORTH和SOUTH是宽度变量
CENTER是宽度和宽度高度变量
LINE_START& LINE_END只是高度变量
所以,我建议你把你的' C'这种BorderLayout区域的容器