【问题标题】:How to make a Java GridBagLayout with six rows and 2 columns如何制作具有 6 行 2 列的 Java GridBagLayout
【发布时间】:2014-06-26 09:36:49
【问题描述】:

我厌倦了 Java GridBagLayout。我想创建一个如下图所示的面板,但我无法获得它。我无法定位左侧面板,并且我未能使面板变长。设置 gridWidth 时宽度不会增加。我不能为此使用任何 GUI 构建器。我想得到如下图的布局。

这是不成功的代码:

public class gui3 extends Frame{
    Panel p1,p2,p3,p4,p5,p6,p7,pmain;
    gui3(){

    setVisible(true);
    setSize(500,500);
    setTitle(" Calculator ");


        GridBagLayout gb1=new GridBagLayout();
        GridBagConstraints gbc=new GridBagConstraints();
        setLayout(gb1);

        p1=new Panel();
        p1.setBackground(Color.BLACK);
        gbc.gridx=5;
        gbc.gridy=0;
        gbc.gridwidth=3;
        //gbc.weightx =0.5;
        gbc.fill=GridBagConstraints.HORIZONTAL;
        add(p1,gbc);

        p2=new Panel();
        p2.setBackground(Color.BLUE);
        gbc.gridx=0;
        gbc.gridy=1;
        gbc.gridwidth=2;
       // gbc.weightx = 1;
        gbc.fill=GridBagConstraints.HORIZONTAL;
        add(p2,gbc);

        p3=new Panel();
        p3.setBackground(Color.GREEN);
        gbc.gridx=0;
        gbc.gridy=2;
        gbc.gridwidth=2;
      //  gbc.weightx = 1;
        gbc.fill=GridBagConstraints.HORIZONTAL;
        add(p3,gbc);

        p4=new Panel();
        p4.setBackground(Color.cyan);
        gbc.gridx=0;
        gbc.gridy=3;
        gbc.gridwidth=2;
      //  gbc.weightx = 1;
        gbc.fill=GridBagConstraints.HORIZONTAL;
        add(p4,gbc);

        p5=new Panel();
        p5.setBackground(Color.RED);
        gbc.gridx=0;
        gbc.gridy=4;
        gbc.gridwidth=2;
     //   gbc.weightx = 1;
        gbc.fill=GridBagConstraints.HORIZONTAL;
        add(p5,gbc);

        p6=new Panel();
        p6.setBackground(Color.pink);
        gbc.gridx=0;
        gbc.gridy=5;
        gbc.gridwidth=2;
       // gbc.weightx = 1;
       // gbc.fill=GridBagConstraints.HORIZONTAL;
        add(p6,gbc);

        p7=new Panel();
        p7.setBackground(Color.yellow);
        gbc.gridx=6;
        gbc.gridy=0;
        gbc.gridheight=6;
     //   gbc.weightx = 1;
        gbc.fill=GridBagConstraints.HORIZONTAL;
        add(p7,gbc);


    }

}

【问题讨论】:

  • GBC 是基于列的,然后创建一个 6/7 列和 6 行的矩阵
  • 一切都取决于是否/如何调整大小

标签: java swing user-interface gridbaglayout


【解决方案1】:

你的意思是……

所以基本上,您可以使用GridBagConstraints#gridheight(或gridwidth)来设置组件将跨越的网格单元数

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestLayout {

    public static void main(String[] args) {
        new TestLayout();
    }

    public TestLayout() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());

                GridBagConstraints gbc = new GridBagConstraints();
                gbc.insets = new Insets(4, 4, 4, 4);
                gbc.gridx = 0;
                gbc.weightx = 1;
                gbc.gridy = 0;
                gbc.fill = GridBagConstraints.HORIZONTAL;
                frame.add(createPane(Color.RED), gbc);
                gbc.gridy++;
                frame.add(createPane(Color.GREEN), gbc);
                gbc.gridy++;
                frame.add(createPane(Color.BLUE), gbc);
                gbc.gridy++;
                frame.add(createPane(Color.CYAN), gbc);
                gbc.gridy++;
                frame.add(createPane(Color.MAGENTA), gbc);
                gbc.gridy++;
                frame.add(createPane(Color.ORANGE), gbc);
                gbc.gridy++;
                frame.add(createPane(Color.PINK), gbc);

                gbc.gridx++;
                gbc.weightx = 0;
                gbc.gridy = 0;
                gbc.weighty = 1;
                gbc.gridheight = GridBagConstraints.REMAINDER;
                gbc.fill = GridBagConstraints.VERTICAL;
                frame.add(createPane(Color.YELLOW), gbc);

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public JPanel createPane(Color color) {
        JPanel pane = new JPanel(){ 

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(50, 50);
            }

        };
        pane.setBackground(color);
        return pane;
    }

}

查看How to Use GridBagLayout了解更多详情

【讨论】:

  • 当然这就是我需要的。它真的很有帮助。但是当我垂直调整它的大小时,行突然变得很窄。我可以避免吗
  • 当可用空间小于组件的首选大小时会发生这种情况。真正避免它的唯一方法是将组件放在滚动窗格中
  • 这很容易解决;看我的回答。
  • @JanBodnar 是的,做得好,您已经解决了一个断章取义的问题并提供了一个任意的解决方案,这可能会对 OP 实际尝试做的事情产生不利影响。覆盖组件的首选/最小尺寸应该是最后的手段。将组件添加到面板并提供布局约束将是一种更通用的解决方案。
  • @MadProgrammer 好吧,我的帖子可能看起来像一个批评,但它并不是故意的。只是这些突如其来的变化,在初学者使用GridBagLayout的时候,往往会迷惑。我只是想传达它可以通过两种方式修复,将最小尺寸设置为首选尺寸或正确设置权重。两者都是恕我直言有效。
【解决方案2】:

MadProgrammer 解决方案的大小突然变化可能是 可以通过两种方式轻松修复:

public JPanel createPane(Color color) {
    JPanel pane = new JPanel(){ 

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(50, 50);
        }

        @Override
        public Dimension getMinimumSize() {
            return new Dimension(50, 50);
        }            

    };
    pane.setBackground(color);
    return pane;
}

我们还提供与首选尺寸相同的最小尺寸。 这样面板不会收缩,而是从窗户上切下来 当容器太小而无法显示时。

最佳解决方案可能是将weighty 设置为 1。面板将 逐渐缩小。

gbc.weightx = 1;
gbc.weighty = 1;
gbc.gridy = 0;

最后,我还用MigLayout 创建了一个解决方案。如果可能,请尝试 使用MigLayout 而不是GridBagLayout 创建布局。

package com.zetcode;

import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;


public class MigLayoutPanels extends JFrame {

    public MigLayoutPanels() {

        initUI();

        setTitle("Panels");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    private void initUI() {

        setLayout(new MigLayout("wrap"));

        add(createPanel(), "w 200, push, grow");
        add(createPanel(), "push, grow");
        add(createPanel(), "push, grow");
        add(createPanel(), "push, grow");
        add(createPanel(), "push, grow");
        add(createPanel(), "push, grow");

        add(createPanel(), "cell 1 0 1 6, growy");


        pack();
    }

   public JPanel createPanel() {
        JPanel pnl = new JPanel(){ 

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(50, 50);
            }

        };

        pnl.setBorder(BorderFactory.createEtchedBorder());
        return pnl;
    }    

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                MigLayoutPanels ex = new MigLayoutPanels();
                ex.setVisible(true);
            }
        });
    }
}

GridBagLayout 是一个强大的管理器,可用于创建大多数布局。 许多程序员发现它很难使用。 MigLayout 比较容易理解, 更强大,更简洁。

【讨论】:

    猜你喜欢
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    相关资源
    最近更新 更多