Фиксированная ширина, переменная высота в JPanel с потоком - PullRequest
7 голосов
/ 06 сентября 2010

У меня раздражающая проблема с менеджерами компоновки 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" ) );
    }
}

Ответы [ 4 ]

10 голосов
/ 06 сентября 2010

Wrap Layout должно помочь.

0 голосов
/ 09 октября 2013

Все, что вы добавляете в LINE_END или LINE_START часть BorderLayout, будет сохранять свою ширину постоянной: только высота будет изменена при изменении размера контейнера

СЕВЕР и ЮГ - переменная ширина

CENTER - переменная ширина и высота

LINE_START и LINE_END - только переменная высота

Итак, я предлагаю вам поместить контейнер 'C' в область BorderLayout

0 голосов
/ 06 сентября 2010
  1. Не следует добавлять детей непосредственно в кадр.Всегда добавляйте к contentPane -> this.getContentPage().add(...)

  2. . Чтобы ваш макет работал, поместите JPanel с GridBagLayout на страницу содержимого и создайте эту панель.заполните страницу содержимого.

  3. Дайте GridBagLayout 2 столбца.

Теперь вы не можете отключить горизонтальное изменение размера окна, поэтому вы должнынайти другой способ справиться с дополнительным пространством.Я предлагаю дать первому столбцу фиксированную ширину (установить fill=NONE) и позволить панели C заполнить оставшееся пространство.

Если вы установите все размеры (мин, макс, предпочтительнее)) панели B до предпочтительного размера, она больше не должна изменять свой размер.

Совет: если макет Swing не работает, вложите его в другой макет.

0 голосов
/ 06 сентября 2010

Лучший способ обеспечить желаемую конфигурацию расширенного представления - это заменить вас FlowLayout на мощный GridBagLayoutManager .Стоит отметить, что ограничения, выражаемые обычно GridBagConstraints , гораздо проще понять при использовании беглых подклассов, например GBC .

Наконец, как всегдавам следует рассмотреть возможность изучения Swing .

...