Jpanel не отображается хорошо с jframe, установленным в gridbaglayout

нижеприведенная программа состоит в том, чтобы расположить jpanel в верхнем левом коннекторе jframe с помощью gridbaglayout, но вместо этого в центре jframe отображается очень маленькая рамка. когда я устанавливаю формат jframe равным null, jpanel отображается в порядке. может кто-нибудь сказать мне, почему jpanel сжимается до центра кадра с помощью gridbaglayout? Мне действительно нужно использовать gridbag. пожалуйста, помогите

import java.awt.*;
import javax.swing.*; //swing package
public class Major {
 //defining the constructor
 public Major() {
 JFrame maFrame = new JFrame("The main screen"); //creating main Jframe
 JPanel headPanel = new JPanel(); //creating the header panel
 maFrame.setSize(900, 700); //setting size
 maFrame.setBackground(Color.LIGHT_GRAY); //setting color of frame
 Container container = maFrame.getContentPane();
 container.setLayout(new GridBagLayout()); //setting layout of main frame
 GridBagConstraints cns = new GridBagConstraints(); //creating constraint
 cns.gridx = 0;
 cns.gridy = 0;
 maFrame.setLocationRelativeTo(null); //centering frame
 headPanel.setBackground(Color.WHITE);
 headPanel.setSize(200, 150);
 container.add(headPanel, cns);
 maFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //setting the default close operation of JFrame
 maFrame.setVisible(true); //making the frame visible
 }
//defining the main method
 public static void main(String[] args) {
 new Major(); //instantiating the class
 }
}
2 ответа

Похоже, вы забыли указать ограничения weightx и weighty для вашего GridBagConstraints. Когда вы их предоставите, вы увидите свой JPanel.

Здесь я изменил код с этими ограничениями.

И никогда не используйте эту строку, headPanel.setSize(200, 150);, поскольку я прокомментировал это, так как ограничения, о которых я упоминал, будут отсортированы для вас.

Добавление нового кода с изображением:

import java.awt.*;
 import javax.swing.*; //swing package
 public class Major 
 {
 //defining the constructor
 public Major() 
 {
 JFrame maFrame = new JFrame("The main screen"); //creating main Jframe
 JPanel headPanel = new JPanel(); //creating the header panel
 maFrame.setBackground(Color.LIGHT_GRAY); //setting color of frame
 Container container = maFrame.getContentPane();
 container.setLayout(new GridBagLayout()); //setting layout of main frame
 GridBagConstraints cns = new GridBagConstraints(); //creating constraint
 cns.gridx = 0;
 cns.gridy = 0;
 //cns.gridwidth = 3;
 //cns.gridheight = 4;
 cns.weightx = 0.3;
 cns.weighty = 0.7;
 cns.anchor = GridBagConstraints.FIRST_LINE_START;
 cns.fill = GridBagConstraints.BOTH;
 maFrame.setLocationRelativeTo(null); //centering frame
 headPanel.setBackground(Color.WHITE);
 container.add(headPanel, cns);
 JPanel panel = new JPanel();
 panel.setBackground(Color.BLUE);
 cns.gridx = 1;
 cns.gridy = 0;
 //cns.gridwidth = 7;
 //cns.gridheight = 4;
 cns.weightx = 0.7;
 cns.weighty = 0.7;
 cns.anchor = GridBagConstraints.PAGE_START;
 cns.fill = GridBagConstraints.BOTH;
 container.add(panel, cns);
 JPanel panel1 = new JPanel();
 panel1.setBackground(Color.DARK_GRAY);
 cns.gridx = 0;
 cns.gridy = 1;
 cns.gridwidth = 2;
 //cns.gridheight = 4;
 cns.weightx = 1.0;
 cns.weighty = 0.3;
 cns.anchor = GridBagConstraints.LAST_LINE_START;
 cns.fill = GridBagConstraints.BOTH;
 container.add(panel1, cns); 
 //JButton button = new JButton("BUTTON");
 //headPanel.add(button);
 maFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //setting the default close operation of JFrame
 maFrame.pack();
 maFrame.setVisible(true); //making the frame visible
 }
 //defining the main method
 public static void main(String[] args) 
 {
 Runnable runnable = new Runnable()
 {
 public void run()
 {
 new Major(); //instantiating the class
 }
 };
 SwingUtilities.invokeLater(runnable); 
 }
}

вот результат:


Вы должны установить weightx и weighty хотя бы одного объекта GridBagConstraint для некоторого значения больше 0.0!

Атрибуты веса используются для указания того, что происходит с дополнительным пространством, если весь макет меньше доступного пространства. Если все веса (для одного направления) равны нулю, значение по умолчанию, весь макет центрирован. Если хотя бы один вес больше нуля, дополнительное пространство распределяется по столбцам или строкам пропорционально его весу, поэтому макет будет занимать все свободное пространство.

licensed under cc by-sa 3.0 with attribution.