jpanel не отображается хорошо с jframe, установленным в gridbaglayout - PullRequest
4 голосов
/ 10 марта 2012

нижеприведенная программа - расположить jpanel в верхнем левом коннере jframe с gridbaglayout, но вместо этого в центре jframe отображается очень маленькая рамкакогда я устанавливаю макет jframe на ноль, 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 ]

6 голосов
/ 10 марта 2012

Похоже, вы забыли предоставить ограничения 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);       
    }
}

вот вывод:

GRIDBAGLAYOUT

4 голосов
/ 10 марта 2012

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

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

...