java - GridBagLayout:均匀分布的单元格

标签 java swing layout-manager gridbaglayout

是否可以使用 GridBagLayout 管理器完全模拟 GridLayout 的行为?

基本上,我有一个 8x8 网格,其中每个单元格应具有相同的宽度和高度。 GridLayout 会自动执行此操作。但我想在网格中添加另一行和一列,其大小与其他行和列不同。该行/列应占用所有可能剩余的剩余空间(因为可用大小不能平均分配到 8 个单元格中)。这有可能吗,还是我必须再次使用不同的布局管理器?

编辑

这是我想要实现的简单图形,简化为只有 4 个单元格: Problem graphic

彩色单元格是我添加到实际网格(灰色)中的单元格,该网格具有相同高度和宽度 x 的单元格。所以网格的高度和宽度是4*x。我现在希望额外的单元格具有必要的宽度/高度(最小尺寸)加上完整尺寸的其余可用宽度/高度。

如果整个面板的尺寸发生变化,灰色网格单元应再次占据尽可能多的空间。

最佳答案

将固定单元格的 GridBagConstraintsweightxweighty 设置为 0 并将 fillNONE。对于 float 单元格,将 fill 设置为 BOTH,对于只应水平扩展的 float 单元格,将 weightx 设置为 1对于垂直扩展的,将 weighty 设置为 1

单元格只有在有任何内容时才会展开,因此您需要用一些东西填充它。我选择了 JLabel 并为固定单元格中的标签设置了固定尺寸。在调整大小时,您需要重新计算尺寸并调用 invalidate() 来重新计算布局。

这是一个 w x h 网格的例子:

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class GridBag {
    public static void main(String[] args) {
        final JFrame f = new JFrame("Gridbag Test");
        final Container c = f.getContentPane();
        c.setLayout(new GridBagLayout());

        final Dimension dim = new Dimension(70, 70);
        final int w = 4;
        final int h = 4;
        final JLabel[] yfloating = new JLabel[w];
        final JLabel[] xfloating = new JLabel[h];
        final JLabel[][] fixed = new JLabel[w][h];

        // adding the vertically floating cells
        final GridBagConstraints gc = new GridBagConstraints();
        gc.fill = GridBagConstraints.BOTH;
        gc.weightx = 0.0;
        gc.weighty = 1.0;
        for(int i = 0; i < w; ++i) {
            yfloating[i] = new JLabel("floating " + i);
            yfloating[i].setBorder(BorderFactory.createLineBorder(Color.BLACK));
            yfloating[i].setHorizontalTextPosition(JLabel.CENTER);
            yfloating[i].setVerticalTextPosition(JLabel.CENTER);
            gc.gridy = 0;
            gc.gridx = i+1;
            c.add(yfloating[i], gc);
        }

        // adding the horizontally floating cells
        gc.fill = GridBagConstraints.BOTH;
        gc.weightx = 1.0;
        gc.weighty = 0.0;
        for(int i = 0; i < w; ++i) {
            xfloating[i] = new JLabel("floating " + i);
            xfloating[i].setBorder(BorderFactory.createLineBorder(Color.BLACK));
            xfloating[i].setHorizontalTextPosition(JLabel.CENTER);
            xfloating[i].setVerticalTextPosition(JLabel.CENTER);
            gc.gridy = i+1;
            gc.gridx = 0;
            c.add(xfloating[i], gc);
        }

        // adding the fixed cells
        gc.fill = GridBagConstraints.NONE;
        gc.weightx = 0.0;
        gc.weighty = 0.0;
        for(int i = 0; i < w; ++i) {
            for(int j = 0; j < h; ++j) {
                fixed[i][j] = new JLabel("fixed " + i);
                fixed[i][j].setBorder(BorderFactory.createLineBorder(Color.BLACK));
                fixed[i][j].setMaximumSize(dim);
                fixed[i][j].setMinimumSize(dim);
                fixed[i][j].setPreferredSize(dim);

                gc.gridx = i+1;
                gc.gridy = j+1;
                c.add(fixed[i][j], gc);
            }
        }

        c.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                final Component comp = e.getComponent();
                final int newSize = Math.min(comp.getHeight() / h, comp.getWidth() / w);
                final Dimension newDim = new Dimension(newSize, newSize);
                for(int i = 0; i < w; ++i) {
                    for(int j = 0; j < h; ++j) {
                        fixed[i][j].setMaximumSize(newDim);
                        fixed[i][j].setMinimumSize(newDim);
                        fixed[i][j].setPreferredSize(newDim);
                    }
                }
                comp.invalidate();
            }
        });

        f.pack();
        f.setVisible(true);
    }
}

关于java - GridBagLayout:均匀分布的单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3695402/

相关文章:

java - 普通接口(interface)和 MBean 接口(interface)之间的区别

java - 基本身份验证 Java SOAP Web 服务客户端

java - 我的 for 循环似乎没有在我的绘制方法中运行

java - Model-View-Presenter被动 View : bootstraping - who displays the view initially?

c# - 在 C# 中为面板创建布局时遇到问题

java - 我如何强制 GridLayout 始终有 7 列

java - 如何格式化 SQL DATETIME 以将其与给定日期进行比较并检索一条记录?

Java浮点指针

java - 进度条 + Java 中的 MVC =?

java - FlowLayout占用垂直空间过多,改变高度