Автоматический размер JPanel внутри JFrame - PullRequest
11 голосов
/ 28 декабря 2008

У меня есть подкласс JPanel, в который я добавляю буутоны, метки, таблицы и т. Д. Для отображения на экране я использую JFrame:

MainPanel mainPanel = new MainPanel(); //JPanel subclass

JFrame mainFrame = new JFrame();
mainFrame.setTitle("main window title");
mainFrame.getContentPane().add(mainPanel);
mainFrame.setLocation(100, 100);
mainFrame.pack();
mainFrame.setVisible(true);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Но когда я изменяю размер окна, размер панели не меняется. Как сделать размер панели таким же, как размер окна, даже если он был изменен?

Ответы [ 5 ]

14 голосов
/ 28 декабря 2008

Вы можете установить менеджер раскладки, такой как BorderLayout, а затем более точно определить, куда должна идти ваша панель:

MainPanel mainPanel = new MainPanel();
JFrame mainFrame = new JFrame();
mainFrame.setLayout(new BorderLayout());
mainFrame.add(mainPanel, BorderLayout.CENTER);
mainFrame.pack();
mainFrame.setVisible(true);

Это помещает панель в центральную область рамки и позволяет ей автоматически увеличиваться при изменении размера рамки.

1 голос
/ 24 июля 2013

По своему опыту я использовал GridLayout.

    thePanel.setLayout(new GridLayout(a,b,c,d));

a = номер строки, b = номер столбца, c = горизонтальный зазор, d = вертикальный зазор.


Например, если я хочу создать панель с:

  • Неограниченная строка (набор = 0)
  • 1 столбец (набор b = 1)
  • вертикальный зазор = 3 (набор d = 3)

Код ниже:

    thePanel.setLayout(new GridLayout(0,1,0,3));

Этот метод полезен, когда вы хотите добавить JScrollPane к вашей JPanel. Размер JPanel внутри JScrollPane будет автоматически изменяться при добавлении в него некоторых компонентов, поэтому JScrollPane автоматически сбросит полосу прокрутки.

1 голос
/ 03 января 2009

Если опция BorderLayout, предоставленная нашими друзьями, не работает, попробуйте добавить ComponentListerner в JFrame и реализовать метод componentResized (event). Когда размер объекта JFrame будет изменен, будет вызван этот метод. Поэтому, если вы напишите код для установки размера JPanel в этом методе, вы достигнете желаемого результата.

Да, я знаю, что это «решение» не годится, но использую его как страховочную сетку. ;)

1 голос
/ 28 декабря 2008

Вам нужно установить менеджер компоновки для использования JFrame - Это касается того, как расположены компоненты. Полезным является менеджер BorderLayout.

Простое добавление следующей строки кода должно исправить ваши проблемы:

mainFrame.setLayout(new BorderLayout());

(Сделайте это перед добавлением компонентов в JFrame)

0 голосов
/ 07 января 2009

Как говорили другие авторы, вам нужно изменить используемый LayoutManager. Я всегда предпочитал использовать GridLayout, чтобы ваш код стал:

MainPanel mainPanel = new MainPanel();
JFrame mainFrame = new JFrame();
mainFrame.setLayout(new GridLayout());
mainFrame.pack();
mainFrame.setVisible(true);

GridLayout кажется мне более концептуально правильным, если вы хотите, чтобы ваша панель занимала весь экран.

...