Заполнение области содержимого панелями

Я устанавливаю панель содержимого JFrame на панель, которую я создал. Эта панель использует Grid Bag Layout для последующих панелей. Я установил этот макет так:

private void initPanel() {

    setLayout(new GridBagLayout());
    constraints = new GridBagConstraints();
    populateGUI();
}

Это заставляет «игру» выглядеть так:

введите здесь описание изображения

Что я на самом деле пытаюсь сделать, так это расширить эти панели (крошечные квадраты). Размеры JFrame составляют 800 x 500, поэтому каждая панель должна занимать 100 x 100, что в сумме составляет 40 панелей. Проблема в том, что панели слишком малы.

Я заполняю панель содержимого JFrame (заменена собственной панелью, отмеченной красным) с помощью этого кода:

private void populateGUI() {

    // Fill the frame with panels
    for (int rowPos = 0; rowPos < numColumns; rowPos++) {

        for (int colPos = 0; colPos < numRows; colPos++) {

            constraints.gridx = rowPos;
            constraints.gridy = colPos;

            // Add component
            add(new GameDummyPanel(gameUtil.generateRandomColour(),
                    panelWidth, panelHeight), constraints);
        }
    }
}

Примечание. Это единственные ограничения, которые я реализую. В классе GameDummyPanel я устанавливаю размер следующим образом:

    public GameDummyPanel( Color panelColor, int panelWidth, int panelHeight )
{
    dummyPanelWidth = panelWidth / 8;
    dummyPanelHeight = panelHeight / 5;

    setBackground( panelColor );
    setSize( new Dimension( dummyPanelWidth, dummyPanelHeight ) );
}

так почему это не соблюдается? Это не похоже на то, что я вызываю пакет на панели и на панели, которая действует как панель содержимого JFrame.

Спасибо

Обновить

Изучив и реализовав ответы, что необходимо сделать — если вы не хотите читать ниже — установить для свойства fill ограничений значение BOTH и удалить все свойства, основанные на размере, из класса панели. Это означает, что мои ограничения выглядят так:

    constraints = new GridBagConstraints();
    constraints.weightx = 1.0;
    constraints.weighty = 1.0;
    constraints.fill = GridBagConstraints.BOTH;

Минус фактически уникальное позиционирование для каждой из панелей, настроенных gridx и gridy. реализацию JPanel можно было бы фактически покончить с созданием JPanel на лету.


person Katana24    schedule 07.05.2014    source источник
comment
этот пост может помочь: stackoverflow.com/questions/1783793/   -  person Dan O    schedule 07.05.2014


Ответы (3)


Попробуйте еще несколько свойств GridBagConstraints.

 constraints.weightx=1.0;
 constraints.weighty=1.0;
 constraints.fill=GridBagConstraints.BOTH;

OR

В этом случае используйте GridLayout вместо GridBagLayout.

private void initPanel() {
    setLayout(new GridLayout(numRows, numColumns));
    populateGUI();
}

введите здесь описание изображения

person Braj    schedule 07.05.2014

Установите следующие значения для панелей:

constraints.weightx = 1.0;
constraints.weighty = 1.0;

Из http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

Если вы не укажете хотя бы одно ненулевое значение для weightx или weighty, все компоненты будут слипаться в центре своего контейнера. Это связано с тем, что когда вес равен 0,0 (по умолчанию), GridBagLayout помещает любое дополнительное пространство между сеткой ячеек и краями контейнера.

Также не стоит задавать размер панелей вручную, пусть GridBagLayout сделает свою работу, просто настройте ограничения по своему вкусу, для простейшего макета как минимум следует учитывать следующие переменные:

gridx, gridy
fill
anchor
weightx, weighty

все они описаны в предыдущей ссылке.

person DSquare    schedule 07.05.2014
comment
Без использования constraints.fill=GridBagConstraints.BOTH; вывод будет другим. - person Braj; 07.05.2014
comment
@Braj Это правильно, я просто дал основному преступнику его проблему, с этого момента он должен настроить свой макет в соответствии со своими потребностями. поскольку, насколько нам известно, GridLayout был бы более подходящим, как вы указали. Также он увеличивает размер панелей, чтобы он мог получить что-то достаточно хорошее только с ними. - person DSquare; 07.05.2014
comment
комбинация того, что вы сказали, и установка свойства fill сделали свое дело. Без свойства fill панели будут довольно маленькими. - person Katana24; 07.05.2014

  • Не вызывайте setSize() на панели.

  • Выполнить переопределение getPreferredSize() панели. GridBagLayout учитывает предпочтительные размеры. Если вы не переопределите, это будет иметь тот эффект, который вы испытываете.

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(SIZE, SIZE);
    }
    
  • Вызывайте frame.pack(), чтобы preferredSize соблюдалось (не устанавливайте размер кадра)

  • Do см. Я избегаю использования методов set(Preferred|Maximum|Minimum)Size в Java Swing?

person Paul Samsotha    schedule 07.05.2014
comment
Спасибо за ответ - ваши рекомендации выше лучших практик? Если да, то где я могу прочитать о них? - person Katana24; 08.05.2014