Фиксированная ширина, переменная высота в JPanel с потоком
У меня раздражающая проблема с менеджерами компоновки Java. У меня следующая ситуация: На панели A есть две другие панели B с абсолютной разметкой и C с FlowLayout. B сильно настроен и имеет фиксированный размер, установленный через setPreferredSize
, C должен иметь такую же фиксированную ширину, как B, но в остальном иметь переменную высоту, в зависимости от того, сколько компонентов добавлено в поток. В результате А должен иметь фиксированную ширину и 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 ответа
Лучший способ обеспечить желаемую конфигурацию расширенного представления - это заменить вас FlowLayout
мощным GridBagLayoutManager. Стоит отметить, что ограничения, выражаемые, как правило, GridBagConstraints, намного легче понять при использовании беглых подклассов, таких как GBC.
Наконец, как всегда, вы должны рассмотреть учебник по Swing.
Все, что вы добавляете в LINE_END или LINE_START часть BorderLayout, будет сохранять свою ширину постоянной: только высота будет изменена при изменении размера контейнера
СЕВЕР и ЮГ - переменная ширина
CENTER - переменная ширина и высота
LINE_START и LINE_END - только переменная высота
Итак, я предлагаю вам поместить ваш контейнер 'C' в этот вид области BorderLayout
Вы не должны добавлять детей в рамку напрямую. Всегда добавляйте в
contentPane
->this.getContentPage().add(...)
Чтобы ваш макет работал, поместите JPanel с GridBagLayout на страницу контента и заставьте эту панель заполнять страницу контента.
Дайте GridBagLayout 2 столбца.
Теперь вы не можете отключить горизонтальное изменение размера окна, поэтому вы должны найти другой способ обработки дополнительного пространства. Я предлагаю дать первому столбцу фиксированную ширину (установить fill=NONE
) и дайте панели C заполнить оставшееся пространство.
Если вы установите все размеры (минимальные, максимальные, предпочтительные) панели B
до предпочтительного размера, он не должен больше менять свой размер.
Совет: Если макет Swing не работает, вложите его в другой макет.