代码之家  ›  专栏  ›  技术社区  ›  Sebiancoder

GridBagLayout网格高度约束不影响结果

  •  0
  • Sebiancoder  · 技术社区  · 7 年前
    我正在使用GRIDBACK布局工作在JavaSwing项目上。我正在尝试制作两个宽度相同、水平对齐但高度不同的面板。

    像这样:

    我有以下代码:

    import javax.swing.*;
    导入Java.AWT.*;
    
    公共类超扩展JFrame{
    
    公共静态void main(string[]args){
    
    新的mega();
    
    }
    
    公共mega()。{
    
    Dimension MinDimension=新Dimension();
    mindimension.width=800;
    mindimension.height=800;
    
    this.setDefaultCloseOperation(jframe.exit在关闭时退出);
    
    jpanel mainpanel=new jpanel();
    mainpanel.setlayout(new gridBagLayout());
    this.add(主面板);
    
    gridBagConstraints constraints=new gridBagConstraints();
    
    jpanel toppanel=new jpanel();
    Toppanel.Background(彩色、灰色);
    
    constraints.gridx=0;
    constraints.gridy=0;
    constraints.gridwidth=1;
    constraints.gridheight=1;
    constraints.weightx=1;
    constraints.weighty=1;
    constraints.insets=新插入(5、5、5、5);
    constraints.anchor=gridBagConstraints.page_start;
    constraints.fill=网格约束.both;
    mainpanel.add(Toppanel,约束);
    
    jpanel bottomppanel=new jpanel();
    底部面板。退台(颜色。绿色);
    
    constraints.gridx=0;
    constraints.gridy=1;
    constraints.gridwidth=1;
    constraints.gridheight=3;
    constraints.weightx=1;
    constraints.weighty=1;
    constraints.insets=新插入(5、5、5、5);
    constraints.anchor=gridbagconstraints.page_end;
    constraints.fill=网格约束.both;
    mainpanel.add(底部面板,约束);
    
    此.setVisible(真);
    
    }
    
    }
    

    使用此代码,底部面板的高度应该是第一个面板的三倍,因为它占用三行,而顶部面板只占用一行。但是,我得到的看起来像这样。

    因为两个面板的高度相同,所以网格高度=3约束看起来并没有什么不同。我做错什么了?

    这样地: enter image description here

    我有以下代码:

    import javax.swing.*;
    import java.awt.*;
    
    public class Mega extends JFrame {
    
        public static void main(String[] args) {
    
            new Mega();
    
        }
    
        public Mega() {
    
            Dimension minDimension = new Dimension();
            minDimension.width = 800;
            minDimension.height = 800;
    
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            JPanel mainPanel = new JPanel();
            mainPanel.setLayout(new GridBagLayout());
            this.add(mainPanel);
    
            GridBagConstraints constraints = new GridBagConstraints();
    
            JPanel topPanel = new JPanel();
            topPanel.setBackground(Color.GRAY);
    
            constraints.gridx = 0;
            constraints.gridy = 0;
            constraints.gridwidth = 1;
            constraints.gridheight = 1;
            constraints.weightx = 1;
            constraints.weighty = 1;
            constraints.insets = new Insets(5, 5, 5, 5);
            constraints.anchor = GridBagConstraints.PAGE_START;
            constraints.fill = GridBagConstraints.BOTH;
            mainPanel.add(topPanel, constraints);
    
            JPanel bottomPanel = new JPanel();
            bottomPanel.setBackground(Color.GREEN);
    
            constraints.gridx = 0;
            constraints.gridy = 1;
            constraints.gridwidth = 1;
            constraints.gridheight = 3;
            constraints.weightx = 1;
            constraints.weighty = 1;
            constraints.insets = new Insets(5, 5, 5, 5);
            constraints.anchor = GridBagConstraints.PAGE_END;
            constraints.fill = GridBagConstraints.BOTH;
            mainPanel.add(bottomPanel, constraints);
    
            this.setVisible(true);
    
        }
    
    }
    

    使用此代码,底部面板的高度应该是第一个面板的三倍,因为它占用三行,而顶部面板只占用一行。但是,我得到的看起来像这样。

    enter image description here

    因为两个面板的高度相同,所以网格高度=3约束看起来并没有什么不同。我做错什么了?

    1 回复  |  直到 7 年前
        1
  •  2
  •   MadProgrammer    7 年前

    gridheight 不会有任何影响,因为没有更多的行可供它展开(想想 gridwidth and gridheight as“expand across”),相反,要么从组件中提供更好的大小调整提示,要么使用 weighty 属性进行播放。

    import java.awt.color;
    导入java.awt.dimension;
    导入java.awt.eventqueue;
    导入java.awt.gridbagConstraints;
    导入java.awt.gridbaglayout;
    导入java.awt.insets;
    导入javax.swing.jframe;
    导入javax.swing.jpanel;
    
    公共类超扩展JFrame{
    
    公共静态void main(string[]args){
    eventQueue.invokelater(new runnable()){
    @覆盖
    public void run()。{
    新的mega();
    }
    })(二)
    
    }
    
    公共mega()。{
    this.setDefaultCloseOperation(jframe.exit在关闭时退出);
    
    jpanel mainpanel=new jpanel()。{
    //这样做是为了演示
    //对于子组件更好
    //提供适当的大小调整提示
    @覆盖
    公共维度getPreferredSize()。{
    返回新尺寸(800、800);
    }
    }(二)
    mainpanel.setlayout(new gridBagLayout());
    this.add(主面板);
    
    gridBagConstraints constraints=new gridBagConstraints();
    
    jpanel toppanel=new jpanel();
    Toppanel.Background(彩色、灰色);
    
    constraints.gridx=0;
    constraints.gridy=0;
    constraints.weightx=1;
    constraints.weighty=0.25;
    constraints.gridwidth=1;
    constraints.fill=网格约束.both;
    constraints.insets=新插入(5、5、5、5);
    mainpanel.add(Toppanel,约束);
    
    jpanel bottomppanel=new jpanel();
    底部面板。退台(颜色。绿色);
    
    constraints.gridy=1;
    constraints.weighty=0.75;
    mainpanel.add(底部面板,约束);
    
    pack();
    setLocationRelativeTo(空);
    此.setVisible(真);
    
    }
    
    }
    
    网格高度作为“扩展”),或者从组件中提供更好的大小调整提示,或者使用weighty财产

    Example

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class Mega extends JFrame {
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new Mega();
                }
            });
    
        }
    
        public Mega() {
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            JPanel mainPanel = new JPanel() {
                // This is done for demonstration purposes
                // it would be better for the child components
                // to provide appropriate sizing hints
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(800, 800);
                }
            };
            mainPanel.setLayout(new GridBagLayout());
            this.add(mainPanel);
    
            GridBagConstraints constraints = new GridBagConstraints();
    
            JPanel topPanel = new JPanel();
            topPanel.setBackground(Color.GRAY);
    
            constraints.gridx = 0;
            constraints.gridy = 0;
            constraints.weightx = 1;
            constraints.weighty = 0.25;
            constraints.gridwidth = 1;
            constraints.fill = GridBagConstraints.BOTH;
            constraints.insets = new Insets(5, 5, 5, 5);
            mainPanel.add(topPanel, constraints);
    
            JPanel bottomPanel = new JPanel();
            bottomPanel.setBackground(Color.GREEN);
    
            constraints.gridy = 1;
            constraints.weighty = 0.75;
            mainPanel.add(bottomPanel, constraints);
    
            pack();
            setLocationRelativeTo(null);
            this.setVisible(true);
    
        }
    
    }