2012-02-08 5 views
2

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

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

 

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

A+B+C make together Center. 

Основная часть состоит из этого дерева частей:
прописные будет меню.
Center - это состоит из 3-х частей A, B, C
Footer - там будет строка состояния


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

+1

Вы не должны установить размер компонентов. Компоненты должны знать свой предпочтительный размер и возвращать его при вызове getPreferredSize(). Большинство макетов используют предпочтительный размер компонентов для их выкладки соответственно. –

+0

Хорошо, я выяснил, что это работа менеджеров макетов ... Я не хочу устанавливать предпочтительный размер компонента. Могу ли я установить размер компонента в Менеджере макетов (менеджерах) строго? – user1097772

+0

Вы не можете установить размеры элементов управления вручную, если только вы не полностью используете диспетчер компоновки и не делаете это * все * вручную. Боюсь, нет среднего пути. –

ответ

-2

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

+2

-1 Для указания нулевого макета. – mre

+0

Не поймите меня неправильно, используя пустой макет - это плохая практика; но, конечно, в крайнем случае, когда у вас возникают проблемы с выбором лучшего менеджера макетов для использования, и никто из них, похоже, не делает то, что вы хотите сделать? – AWb

+2

Null layout никогда не является ответом. – mre

2

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

+0

Sry, но это не ответ на мой вопрос ... Как установить размер частей. – user1097772

+0

Настройка предпочтительного размера компонента 'C' - это все, что необходимо (в дополнение к общей стратегии xyz) для создания графического интерфейса с логическим размером. Если вы хотите немного «выложить», добавьте границы там, где это необходимо. Я собирался создать графический интерфейс, который в основном соответствовал формуле, обозначенной xyz, до тех пор, пока а) я не увидел, что это уже было сказано, и б) вы утверждали, что это не то, что нужно! –

+0

Я не согласен, потому что это приводит к тому, что размер 'ab' (resp width, heignt тоже такой же, но это не проблема) будет таким же, как размер' C'. (Установка предпочтительного размера также на ab тоже не работает ..). – user1097772

2

В общем, 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(); 
    } 
} 
+0

О, и чтобы это действительно * действительно, конечно, лучше переопределить методы getMaximumSize и 'getMinimumSize' ... –

+0

*« Если вы действительно хотите убедиться, что элемент пользовательского интерфейса C имеет определенный размер, .. переопределить getPreferredSize "* Некоторые менеджеры макетов не будут соблюдать предпочтительный размер. И я никогда не понимал преимущества переопределения 'setPreferredSize()', когда вы можете просто вызвать его из конструктора и оставить его разработчику, чтобы выбрать, является ли размер * по умолчанию * предпочтительным размером, который они хотят. –

+0

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

1

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

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

Этот ответ слишком мало и слишком поздно,

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

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

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

С помощью setPreferredSize, вы будете иметь возможность изменить настройки по умолчанию предпочтительных размеров компонента

Смежные вопросы