Как сделать так, чтобы компонент в .CENTER Borderlayout занимал все центральное пространство и изменял размеры в приложении? - PullRequest
3 голосов
/ 28 апреля 2011

Мое приложение / JFrame, использующее Borderlayout, имеет панель инструментов вверху или на севере, строку состояния внизу или на юге и JPanel.JTabbedPane.JScrollPane.JTable в центре.JPanel - это всегда фиксированный размер, который приблизительно настраивается с помощью различных методов set * Size (), применяемых в различных комбинациях к различным компонентам.Но это всегда фиксированный размер и всегда есть промежутки между востоком и западом.Северный и южный компоненты остаются фиксированными по высоте и изменяются по горизонтали, как и следовало ожидать.

Конечно, это не новый или уникальный дизайн.

Это нормальное поведение?Есть какой-то трюк, который я пропустил?

1 Ответ

3 голосов
/ 29 апреля 2011

Это характерно для сохранения значения по умолчанию FlowLayout из JPanel и добавления панели в центр BorderLayout. В приведенном ниже примере сравниваются панели, имеющие FlowLayout, значение по умолчанию или GridLayout. Для контраста, эти два добавляются к GridLayout, что позволяет расширение аналогично центру BorderLayout.

layout comparison image

import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTree;

/** @see http://stackoverflow.com/questions/5822810 */
public class LayoutPanel extends JPanel {

    public LayoutPanel(boolean useGrid) {
        if (useGrid) {
            this.setLayout(new GridLayout());
        } // else default FlowLayout
        this.add(new JTree());
    }

    private static void display() {
        JFrame f = new JFrame("LayoutPanels");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(new GridLayout(1, 0));
        f.add(new LayoutPanel(false));
        f.add(new LayoutPanel(true));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                display();
            }
        });
    }
}
...