7

我对 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

4 回答 4

10

换行布局应该有所帮助。

于 2010-09-06T15:19:21.833 回答
0

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

NORTH 和 SOUTH 是宽度可变的

CENTER 是宽度和高度可变的

LINE_START & LINE_END 只是高度可变的

所以,我建议你把你的“C”容器放在这种 BorderLayout 区域

于 2013-10-09T09:15:43.223 回答
0

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

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

于 2010-09-06T12:06:32.317 回答
0
  1. 您不应该直接将孩子添加到框架中。始终添加到contentPane->this.getContentPage().add(...)

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

  3. 给 GridBagLayout 2 列。

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

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

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

于 2010-09-06T12:19:39.153 回答