代码之家  ›  专栏  ›  技术社区  ›  poke

固定宽度,可变高度,jpanel随流量变化

  •  7
  • poke  · 技术社区  · 14 年前

    我有一个恼人的问题与Java As的布局管理器。我有以下情况:在小组中 还有两个面板吗 绝对布局和 C 带有流程布局。 高度定制并通过 setPreferredSize . C 应该有同样的 固定的 宽度为 但除此之外,高度是可变的,这取决于在流中添加了多少组件。结果 然后应该有固定的宽度和 A.height + B.height 因为身高至少是我想要的。

    但是我得到的是面板的宽度 完全不固定(即使我设置了它的首选大小),面板中的内容 C 不是自动换行,而是以长线显示。当然,这也使得 宽度比实际宽度大。

    我能做些什么来解决这个问题?有没有更好的布局,或者我必须使用绝对布局来模拟所有的布局?

    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 回复  |  直到 11 年前
        1
  •  10
  •   camickr    14 年前

    Wrap Layout 应该帮助。

        2
  •  0
  •   Riduidel    14 年前

    提供所需高级视图配置的最佳方法是替换 FlowLayout 被强大的 GridBagLayoutManager . 值得注意的是,约束通常由 GridBagConstraints ,在使用fluent子类时更容易理解,例如 GBC .

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

        3
  •  0
  •   Aaron Digulla    14 年前
    1. 您不应该直接向框架添加子项。总是添加到 contentPane -gt; this.getContentPage().add(...)

    2. 要使布局正常工作,请使用 GridBagLayout 在内容页中,使该面板填充内容页。

    3. 将GridBagLayout设为2列。

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

    如果设置面板的所有大小(最小、最大、首选) B 对于首选的大小,它不应该再改变它的大小。

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

        4
  •  0
  •   Doume    11 年前

    在borderlayout的行\结束或行\开始部分中放置的所有内容都将保持其宽度不变:如果容器大小调整,则仅调整高度

    南北宽度可变

    中心是宽度和高度可变的

    线条\开始和线条\结束只是高度变量

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