Макеты в Java Swing с указанием размера - PullRequest
2 голосов
/ 08 февраля 2012

Мой вопрос: как я могу указать размер частей на моем макете? Мне нужно каким-то образом установить размер «частей», не используя PreredSize, может быть, в менеджерах раскладки, где бы то ни было - нужен только стабильный размер.

Я хочу создать раскладку для игры,Я уже создал один, но я имею дело с проблемой размера компонентов.Поэтому я подумал, что было бы лучше составить лучшую концепцию моего макета.Давайте посмотрим на мой черновик.


+-----------+ 
| UPPER     |
+-----+-----+
|  A  |     |
+-----+  C  |
|  B  |     |
+-----+-----+
| Footer    |
+-----------+

A+B+C make together Center.

Основная часть состоит из следующих частей дерева:Верхний - будет меню.Центр - состоит из 3 частей A, B, CНижний колонтитул - будет строка состоянияМоя идея состоит в том, чтобы иметь возможность установить размер каждого компонента.Вся компоновка зависит от части C, она может иметь размер 450x450 px или 600x600 px.Для частей A и B мне нужно указать только ширину, потому что будет только некоторая текстовая информация - она ​​должна быть около 300 пикселей.Я попытался использовать GridBagLayout для центральной части, но setSize для C не сработал.Я делаю части в контейнерах (java.awt.Container) - в них я добавляю содержимое каждой части, а затем добавляю контейнер на верхний уровень.

Ответы [ 5 ]

2 голосов
/ 08 февраля 2012

Самый простой способ: использовать BorderLayout для contentPane (который уже есть) - Верхняя панель выходит на север - Панель нижнего колонтитула идет на юг - Панели A и B входят в панель ab с помощью GridLayout (2,1) - Панель ab и C переходит в панель abc с помощью GridLayout (1,2) - Панель abc уходит в центр И setPrefferedSize () вашего A, B, C

2 голосов
/ 08 февраля 2012

Как правило, GridBagLayout игнорирует значения, установленные для элементов управления с setSize, вместо этого он запрашивает элементы управления для их предпочтительного размера (вызывая getPreferredSize) и использует их для расчета общего макета. Простая установка предпочтительного размера самостоятельно не рекомендуется, поскольку большинство элементов управления, как правило, пересчитывают эти значения при каждом запуске макета, поэтому вам будет сложно заставить их «застрять».

Если вы действительно хотите убедиться, что элемент C пользовательского интерфейса имеет определенный размер, реализуйте его как пользовательский класс, производный от подходящей базы (например, JPanel), и переопределите метод getPreferredSize, чтобы сделайте так, чтобы он возвращал размер, который вы хотите / нужен для этой части вашего пользовательского интерфейса.

Редактировать: Вот небольшой пример для оболочки, которая может содержать другой элемент пользовательского интерфейса и может быть установлен на фиксированный размер (используя переопределенный метод setSize), который должен соблюдаться менеджеры по расположению:

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JComponent;
import javax.swing.JPanel;

public class FixedSizeComponent extends JPanel {
    private Dimension size;
    private final JComponent content;

    public FixedSizeComponent(JComponent content) {
        super(new BorderLayout());
        this.content = content;
        super.add(content, BorderLayout.CENTER);
    }

    @Override
    public void setSize(Dimension d) {
        size = d;
    }

    @Override
    public void setSize(int width, int height) {
        size = new Dimension(width, height);
    }

    @Override
    public Dimension getSize() {
        if (size != null) return size;
        return content.getSize();
    }

    @Override
    public Dimension getSize(Dimension rv) {
        if (size != null) {
            if (rv == null) rv = new Dimension();
            rv.height = size.height;
            rv.width = size.width;
            return rv;
        }
        return content.getSize(rv);
    }

    @Override
    public Dimension getPreferredSize() {
        if (size != null) return size;
        return content.getPreferredSize();
    }

    @Override
    public Dimension getMaximumSize() {
        if (size != null) return size;
        return content.getMaximumSize();
    }

    @Override
    public Dimension getMinimumSize() {
        if (size != null) return size;
        return content.getMinimumSize();
    }
}
1 голос
/ 09 июня 2012

У меня была похожая проблема с панелью инструментов состояния внизу, содержащей ряд других компонентов. Моя проблема заключалась в том, что он станет выше. Поэтому я переопределил максимальный размер, установив максимальную высоту равной минимальной высоте.

JPanel status = new JPanel( new SpringLayout() ) {
  @Override
  public Dimension getMaximumSize() {
    Dimension max = super.getMaximumSize();
    Dimension min = getMinimumSize();
    return new Dimension( max.width, min.height );
  }
};
0 голосов
/ 09 августа 2016

Этот ответ слишком мал, и СЛИШКОМ слишком поздно,

(возможно, этот метод не существовал на момент постановки этого вопроса)

точно так же как getPreferredSize, есть также метод setPreferredSize, который принимает объект Dimension.

По умолчанию ваш макет будет игнорировать размеры ваших компонентов (которые вы могли установить с помощью setSize), вместо этого он будет использовать предпочтительные размеры.

Используя setPreferredSize, вы сможете переопределить предпочтительные размеры компонента по умолчанию

0 голосов
/ 08 февраля 2012

Я надеюсь, что мой ответ может вам как-то помочь. Из опыта установки размера JPanel или JFrame я всегда использовал setPreferredSize(new Dimension(WIDTH,HEIGHT));

...