固定宽度,JPanel中可变高度与流量

时间:2010-09-06 11:52:44

标签: java swing fixed-width layout-manager

我对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" ) );
    }
}

4 个答案:

答案 0 :(得分:10)

Wrap Layout应该有帮助。

答案 1 :(得分:0)

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

最后,与往常一样,您应该考虑查看Swing tutorial

答案 2 :(得分:0)

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

  2. 要使您的布局有效,请在内容页面中放置一个带有GridBagLayout的JPanel,并使该面板填充内容页面。

  3. 给GridBagLayout 2列。

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

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

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

答案 3 :(得分:0)

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

NORTH和SOUTH是宽度变量

CENTER是宽度和宽度高度变量

LINE_START& LINE_END只是高度变量

所以,我建议你把你的' C'这种BorderLayout区域的容器