【问题标题】:Align content to top with GridBagLayout使用 GridBagLayout 将内容与顶部对齐
【发布时间】:2017-03-17 14:09:49
【问题描述】:

我使用 GridBagLayout 来放置面板,如下所示。我想将所有内容都对齐到顶部。我可以通过在我的背景面板(jp)上使用 BorderLayout.NORTH 来管理它,但是背景面板不会填满窗口

如何使用 GridBagLayout 将面板与顶部对齐?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test extends JFrame {

    JPanel jp = new JPanel();
    JPanel jp1 = new JPanel();
    JPanel jp2 = new JPanel();
    JPanel jp3 = new JPanel();
    JPanel jp4 = new JPanel();

    public Test() {
        jp1.setPreferredSize(new Dimension(100, 100));
        jp2.setPreferredSize(new Dimension(100, 100));
        jp3.setPreferredSize(new Dimension(100, 100));
        jp4.setPreferredSize(new Dimension(100, 100));

        jp1.setBackground(Color.red);
        jp2.setBackground(Color.blue);
        jp3.setBackground(Color.yellow);
        jp4.setBackground(Color.green);

        GridBagLayout g = new GridBagLayout();
        jp.setLayout(g);
        jp.setBackground(Color.BLACK);

        GridBagConstraints con;
        con = new GridBagConstraints();
        con.insets = new Insets(3, 3, 3, 3); // top, left, bottom, right

        // PANEL ONE
        con.gridx = 0;
        con.gridy = 0;
        g.setConstraints(jp1, con);
        jp.add(jp1);

        // PANEL TWO
        con.gridx = 1;
        con.gridy = 0;
        g.setConstraints(jp2, con);
        jp.add(jp2);

        // PANEL THREE
        con.gridx = 0;
        con.gridy = 1;
        g.setConstraints(jp3, con);
        jp.add(jp3);

        // PANEL FOUR
        con.gridx = 1;
        con.gridy = 1;
        g.setConstraints(jp4, con);
        jp.add(jp4);

        this.setSize(600, 300);
        // I CAN MANAGE TO GET THE PANELS ALIGNED TO THE TOP BY USING BORDERLAYOUT
        // LIKE BELOW BUT THEN THE BACKGROUNDPANEL DOESNT FILL THE WINDOW
        // this.add(jp, BorderLayout.NORTH);

        this.add(jp);
    }

    public static void main(String[] args) {
        new Test().setVisible(true);
    }
}

【问题讨论】:

    标签: java swing alignment layout-manager gridbaglayout


    【解决方案1】:

    但是背景面板没有填满窗口

    为什么要让 backgroundPanel 填满窗口?

    如果你只想要黑色背景,那么你可以这样做:

    //this.add(jp);
    this.getContentPane().setBackground( jp.getBackground() );
    this.add(jp, BorderLayout.NORTH);
    

    或者在使用 GridBagLayout 时,您需要指定“anchor”和“weighty”约束:

    con.gridx = 0;
    con.gridy = 0;
    con.anchor = ...;
    
     ...
    
    con.gridx = 1;
    con.gridy = 1;
    con.weighty = ...;
    

    阅读 How to Use GridBagLayout 上的 Swing 教程部分以了解这些约束的作用。我已经指出了您需要使用哪些约束以及在您的示例中包含它们的位置。

    另一种方法是使用包装面板:

    JPanel wrapper = new JPanel();
    wrapper.setBackground( Color.BLACK );
    wrapper.add( jp );
    this.add( wrapper );
    

    默认情况下,JPanel 使用 FlowLayout,它将尊重添加到面板的任何组件的大小。

    【讨论】:

      猜你喜欢
      • 2013-04-04
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 2023-04-02
      • 2021-05-16
      • 2012-05-03
      • 1970-01-01
      相关资源
      最近更新 更多