Фиксированная ширина, переменная высота в JPanel с потоком

У меня раздражающая проблема с менеджерами компоновки Java. У меня следующая ситуация: На панели A находятся две другие панели B с абсолютной компоновкой и C с FlowLayout. 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" ) );
    }
}
7
задан skaffman 6 September 2010 в 12:01
поделиться