Java 带流量的JPanel中的固定宽度、可变高度
我对Java的布局管理器有一个恼人的问题。我有以下情况:在一个面板a中,有两个其他面板B具有绝对布局,而C具有流动布局。B是高度定制的,通过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的宽度比它应该的大
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(…)
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
也是编写自己的经理的好例子。