Проблема с FlowLayout - PullRequest
2 голосов
/ 29 марта 2010
public class MyFrame extends JFrame
{
public MyFrame(String title)
{

    setSize(200, 200);
    setTitle(Integer.toString(super.getSize().width));
    setLayout(new FlowLayout());
    for (int i = 0; i < 5; ++i)
    {
        JButton b = new JButton();
        b.setSize(90,50);
        b.setText(Integer.toString(b.getSize().width));
        this.add(b);![alt text][1]
    }
    this.setVisible(true);
}
}

почему, если у меня кнопка 90, я получаю окно, в котором три кнопки находятся в одном ряду вместо двух?

Ответы [ 3 ]

5 голосов
/ 29 марта 2010

FlowLayout выложит Component s слева направо (или справа налево), оборачивая их при необходимости. Если вы хотите явно установить размер каждого JButton, вам следует использовать setPreferredSize вместо setSize, поскольку менеджеры макета обычно используют минимальный, предпочтительный и максимальный размеры при выполнении макета.

Свойства размера довольно запутанные - здесь есть интересная статья . В частности, примечание:

Свойства размера всегда заслуженный

Некоторые менеджеры по расположению, такие как GridLayout, полностью игнорирует размер Свойства .

FlowLayout, попытки почтить оба размеры предпочитаемого размера, и возможно, нет необходимости в чести либо минимальный размер или максимальный размер.

0 голосов
/ 29 марта 2010

FlowLayout просто размещает один компонент рядом с другим в порядке слева направо. Когда ширина достигает одного из контейнеров с таким макетом, он просто переносится на другую строку.

Если вы хотите расположить их в виде сетки (как вам кажется), вы можете использовать GridLayout, который позволяет вам указать количество столбцов и строк:

component.setLayout(new GridLayout(2,2))

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

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

Возможно, ваша проблема с размером связана с тем, что вы используете setSize, но в Swing эти вещи ведут себя странно, вам следует попробовать установить setPreferredSize(200,200) вместо setSize. Но не спрашивайте меня, почему!

ПРИМЕЧАНИЕ : Вы должны ВСЕГДА ссылаться на панель содержимого фрейма, а не на сам фрейм. Когда вы устанавливаете макет, вы должны сделать getContentPane().setLayout(..), когда вы добавляете элементы, вы должны сделать getContentPane().add(..) и т. Д.

Ошибки: теперь каждые JFrame add, remove, setLayout автоматически пересылаются на панель содержимого.

0 голосов
/ 29 марта 2010

Во-первых, вы не используете JFrame правильно: вы не добавляете компоненты непосредственно в кадр, вы добавляете их в JPanel, который затем передаете в кадр с setContentPane(). * 1004. *

Также: не очень элегантно напрямую создавать подкласс JFrame только для добавления компонентов. Вместо этого создайте свой фрейм как отдельный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...