Автоматический размер JPanel внутри JFrame
Вопрос
У меня есть подкласс 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);
Но когда я изменяю размер окна, размер панели не меняется.Как сделать так, чтобы размер панели совпадал с размером окна, даже если его размер был изменен?
Решение
Вы можете установить менеджер компоновки, такой как BorderLayout, а затем более конкретно определить, куда должна идти ваша панель:
MainPanel mainPanel = new MainPanel();
JFrame mainFrame = new JFrame();
mainFrame.setLayout(new BorderLayout());
mainFrame.add(mainPanel, BorderLayout.CENTER);
mainFrame.pack();
mainFrame.setVisible(true);
Это помещает панель в центральную область рамки и позволяет ей автоматически увеличиваться при изменении размера рамки.
Другие советы
Вам нужно настроить менеджер компоновки для использования JFrame - он определяет, как располагаются компоненты.Полезным из них является менеджер BorderLayout manager.
Простое добавление следующей строки кода должно устранить ваши проблемы:
mainFrame.setLayout(new BorderLayout());
(Сделайте это перед добавлением компонентов в JFrame)
Если опция BorderLayout, предоставленная нашими друзьями, не работает, попробуйте добавить ComponentListerner в JFrame и реализовать метод componentResized(событие).Когда размер объекта JFrame будет изменен, будет вызван этот метод.Таким образом, если вы напишете код для установки размера JPanel в этом методе, вы достигнете желаемого результата.
Да, я знаю, что это "решение" нехорошо, но используй его в качестве подстраховки.;)
Исходя из моего опыта, я использовал GridLayout .
thePanel.setLayout(new GridLayout(a,b,c,d));
a = номер строки, b = номер столбца, c = горизонтальный зазор, d = вертикальный зазор.
Например, если я хочу создать панель с:
- неограниченный ряд (установите a = 0)
- 1 столбец (набор b = 1)
- вертикальный зазор = 3 (установить d = 3)
Код приведен ниже:
thePanel.setLayout(new GridLayout(0,1,0,3));
Этот метод полезен, когда вы хотите добавить JScrollPane в свою JPanel.Размер JPanel внутри JScrollPane автоматически изменится, когда вы добавите в него некоторые компоненты, поэтому JScrollPane автоматически сбросит полосу прокрутки.
Как уже говорилось в других постерах, вам нужно изменить используемый LayoutManager.Я всегда предпочитал использовать GridLayout, чтобы ваш код стал:
MainPanel mainPanel = new MainPanel();
JFrame mainFrame = new JFrame();
mainFrame.setLayout(new GridLayout());
mainFrame.pack();
mainFrame.setVisible(true);
GridLayout кажется мне более концептуально правильным, когда вы хотите, чтобы ваша панель занимала весь экран.