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.