Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带流量的JPanel中的固定宽度、可变高度_Java_Swing_Fixed Width_Layout Manager - Fatal编程技术网

Java 带流量的JPanel中的固定宽度、可变高度

Java 带流量的JPanel中的固定宽度、可变高度,java,swing,fixed-width,layout-manager,Java,Swing,Fixed Width,Layout Manager,我对Java的布局管理器有一个恼人的问题。我有以下情况:在一个面板a中,有两个其他面板B具有绝对布局,而C具有流动布局。B是高度定制的,通过setPreferredSize设置了固定大小。C应具有与B相同的固定宽度,但根据流中添加的组件数量,其高度应可变。结果A应该具有固定的宽度,并且A.height+B.height作为高度–至少这是我想要的 然而,我得到的是,面板A的宽度根本不是固定的(即使我设置了它的首选大小),面板C中的内容不会自动包装,而是以长线显示。当然,这也使得B的宽度比它应该的大

我对Java的布局管理器有一个恼人的问题。我有以下情况:在一个面板a中,有两个其他面板B具有绝对布局,而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" ) );
    }
}

提供所需高级视图配置的最佳方法是用强大的。值得注意的是,当使用fluent子类时,约束(通常用表示)更容易理解,如

最后,像往常一样,你应该考虑看看

  • 不应直接将子对象添加到框架中。始终添加到
    contentPane
    ->
    this.getContentPage().add(…)

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

  • 给GridBagLayout设置两列

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

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


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

    应该会有所帮助。

    您在BorderLayout的行尾或行首部分中放置的所有内容都将保持其宽度不变:如果调整容器大小,则仅调整高度

    南北是可变宽度的

    中心是宽度和高度可变的

    直线起点和直线终点是唯一的高度变量


    因此,我建议您将您的“C”容器放在这种BorderLayout区域中,关于第1点:“为方便起见,
    add
    及其变体,
    remove
    setLayout
    已被覆盖,以便根据需要转发到
    contentPane
    。”注意,我不是在框架/窗口中工作,但我上面的实际类本身就是一个JPanel。这是我描述中的面板A,用于不同的布局,该布局不会改变其大小。@trashgood:那是从Java 6开始的。@poke:啊。然后给面板A一个GridBagLayout,2列,相同的宽度(给它们相同的重量)。嗯,谢谢你的链接(特别是GBC^^),但是我不知道如何重现FlowLayout给我的GridBagLayout的效果。实际上,我确实希望将这些组件(这里是按钮)包装到下一行,因为父JPanel的宽度固定,所以没有足够的空间。这实际上非常有效!如果没有人提出本机解决方案,这就是我要做的。非常感谢。可惜的是,标准布局管理器在这种常见(至少对我来说)情况下总是失败,而您最终总是会得到一个新的自定义布局管理器..:/@对我来说,这代表了一种选择偏见——我倾向于忘记标准布局通常是有效的
    WrapLayout
    也是编写自己的经理的好例子。