在 GridLayout 中处理 exceeding/outer space

Handling exceeding/outer space in GridLayout

使用 GridLayout 时,它会将容器的 space 均匀分布在行元素和列元素之间。但是,当计算单元格宽度不会变成整数时,超出的 space 以某种方式放在容器的边缘与其内容之间,即容器的内容以 GridLayout 为中心。

在这张图片中你可以看到超过 space(绿色):

由于框架的大小被拖到 233x233,LayoutManager 将提供每个组件 floor(233 / 20) = 11 像素的高度和宽度。因此 233 % 20 = 13 个像素超出并放在边缘。

这就是图片中生成边框的代码:

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GridLayout layout = new GridLayout(20, 0);
    layout.setHgap(0);
    layout.setVgap(0);
    frame.setLayout(layout);
    for (int j = 0; j < 20; j++) {
        for (int i = 0; i < 20; i++) {
            JPanel panel = new JPanel();
            panel.setBackground((i + j) % 2 == 0 ? Color.BLACK : Color.WHITE);
            frame.add(panel);
        }
    }
    frame.pack();
    frame.getContentPane().setBackground(Color.GREEN);
    frame.setVisible(true);

所以我想知道是否有一种简单的方法可以使容器 'clip' 或以某种方式对齐,超过 space 的不会显示出来,而是调整容器的大小以适合它的内容非常完美。

That's right but I want to keep the advantage of a GridLayout offering every cell the same size,

是的,你不能两全其美。

  1. 如果您希望每个单元格大小相同,那么您将看到背景。一种选择是使面板不透明,这样您就看不到面板的背景。

  2. 如果要用组件完全填充可用区域,则某些组件的大小需要相差一个像素。

为了实现第 2 点,也许这个例子对您来说足够容易使用:

import java.awt.*;
import javax.swing.*;

public class BoardTest
{
    private static void createAndShowGUI()
    {
        Float constraint = new Float(1);

        RelativeLayout boardLayout = new RelativeLayout(RelativeLayout.Y_AXIS);
        boardLayout.setRoundingPolicy( RelativeLayout.EQUAL );
        boardLayout.setFill(true);

        JPanel board = new JPanel(boardLayout);
        board.setBackground(Color.GREEN);

        RelativeLayout rowLayout = new RelativeLayout(RelativeLayout.X_AXIS);
        rowLayout.setRoundingPolicy( RelativeLayout.EQUAL );
        rowLayout.setFill(true);

        for (int j = 0; j < 20; j++)
        {
            JPanel row = new JPanel( rowLayout );

            for (int i = 0; i < 20; i++)
            {
                JPanel square = new JPanel();
                square.setBackground((i + j) % 2 == 0 ? Color.BLACK : Color.WHITE);
                row.add(square, constraint);
            }

            board.add(row, constraint);
        }

        JFrame frame = new JFrame("BoardTest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(board);
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater( () -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}

它使用 Relative Layout class 允许您控制如何将额外像素分配给每个组件。