Java Swing: FlowLayout JPanels сидят рядом друг с другом? - PullRequest
6 голосов
/ 22 ноября 2010

У меня есть три JPanels, нарисованные на JFrame.В настоящее время все они настроены на использование FlowLayout по умолчанию.Я хотел бы, чтобы они были один над другим в одном столбце.

Однако я обнаружил, что они плавают рядом друг с другом в одной строке, если их компоненты находятся внутри.

Является ли естественная ширина JP Flow FlowLayout суммой его содержимого?Если это так, есть ли способ заставить ширину области быть шириной JFrame?

Интересно, я обнаружил, что, если у «верхней» и «нижней» панелей есть контент, который охватываетна всю ширину JFrame, а «средняя» панель оставлена ​​пустой, так что «средняя» панель создает пространство между ними, очень похоже на старую »html.

Спасибо,

Бен

Ответы [ 4 ]

4 голосов
/ 22 ноября 2010

Как сказал Джим, BoxLayout является правильным выбором, если вам нужно выровнять компоненты по линейному закону.

Вот пример:

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 *
 * @author nicholasdunn
 */
public class BoxLayoutExample extends JPanel {

    public BoxLayoutExample() {
        JPanel topPanel = new JPanel();
        JPanel middlePanel = new JPanel();
        JPanel bottomPanel = new JPanel();

        topPanel.setBorder(BorderFactory.createEtchedBorder());
        middlePanel.setBorder(BorderFactory.createEtchedBorder());
        bottomPanel.setBorder(BorderFactory.createEtchedBorder());

        topPanel.add(new JLabel("Top"));
        middlePanel.add(new JLabel("Middle"));
        bottomPanel.add(new JLabel("Bottom"));

        BoxLayout boxLayout = new BoxLayout(this, BoxLayout.PAGE_AXIS);
        setLayout(boxLayout);
        add(topPanel);
        add(middlePanel);
        add(bottomPanel);

    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new BoxLayoutExample();
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}

alt text

Выбыло бы неплохо по-настоящему прочитать введение в менеджеры макетов , чтобы понять базовый набор LayoutManager.Когда придет время делать сложные макеты, используйте MigLayout вместо того, чтобы пытаться изучать GridBagLayout - вы будете благодарить меня.

2 голосов
/ 22 ноября 2010

Если вы хотите создать вертикальный макет, вы можете захотеть использовать BoxLayout для вмещающего контейнера.Это можно настроить для компонентов макета вдоль оси y.

1 голос
/ 22 ноября 2010

Вы можете использовать GridLayout для создания YxZ сетки в компоненте.Для более точного построения макета вы можете использовать GridBagLayout, который обеспечивает полный контроль позиционирования и размеров для вложенных компонентов.

0 голосов
/ 22 ноября 2010

Я всегда иду с NetBeans . Так как я могу сделать Free Design без каких-либо проблем с размещением компонентов на JPanel или JFrame :) Вы можете рассмотреть это.

...