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