当 JFrame 包含 GridLayout 时,我可以为它设置特定的边框大小吗?

Can I set a specific border size for JFrame when it contains GridLayout?

这是一个示例 class

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

public class Image {

public static void main(String[] args) {

        JFrame f = new JFrame();
      Layout lo = new Layout();

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(new Dimension(500, 500));
        f.setLocationRelativeTo(null);
        f.getContentPane().add(lo.getGUI(), BorderLayout.CENTER);
        f.setVisible(true);
        }
}

这是自带的布局class

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

public class Layout {

    private JPanel p;

    public Layout() {
        p = new JPanel(new GridLayout(5, 5, 1, 1));
        p.setBackground(Color.BLACK);

        JLabel[][] lbs = new JLabel[5][5];

        for (int i = 0; i < 5; i++)
            for (int j = 0; j < 5; j++) {
                lbs[i][j] = new JLabel(".", JLabel.CENTER);
                lbs[i][j].setBackground(Color.WHITE);
                lbs[i][j].setOpaque(true);
                p.add(lbs[i][j]);
            }
    }

    public JComponent getGUI() {
        return p;
    }
}

代码的结果是这样的:

所以,我的问题是如何调整像上图那样的固定尺寸?我想稍后添加组件,例如稍后在其上的按钮。在对 JPanel 应用 GridLayout 之后,我无法弄清楚如何设置固定大小的 JPanel。我向其中添加了 GridLayout,因为我需要它来显示类似于国际象棋的内容。除了按钮,我什么都不会碰。 JPanel 用于查看,仅此而已。

我应该提一下,我会将网格中间的点更改为其他符号(例如 ! 或 #)以表示 5x5 space 中的对象。我使用 JLabel 来呈现对象。如果我使用 GridBagLayout,所有的符号都被压在 1 个区域中。

我不确定我是否 100% 理解您的要求,但如果您希望在网格周围留空 space,那么您可能正在寻找的是 EmptyBorder,很容易通过 BorderFactor.createEmptyBorder(gap, gap, gap, gap); 获得,其中 gap 是边框的大小,当然可以是每一边的唯一值。

不要忘记嵌套 JPanel,每个 JPanel 使用自己的布局,以获得最大的布局效果。例如,以下 GUI 由下面的代码生成:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.*;

@SuppressWarnings("serial")
public class LayoutTest extends JPanel {
    private static final int CELL_WIDTH = 100;
    private static final int SIDES = 5;
    private static final int GAP = 25;
    private static final Color BG = Color.WHITE;
    private LayoutPanel layoutPanel = new LayoutPanel(CELL_WIDTH, SIDES);

    public LayoutTest() {
        setBackground(BG);
        JPanel btnPanel = new JPanel(new GridLayout(1, 0, GAP, GAP));
        btnPanel.add(new JButton("Button 1"));
        btnPanel.add(new JButton("Button 2"));
        btnPanel.setBackground(BG);

        setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        setLayout(new BorderLayout(GAP, GAP));
        add(layoutPanel, BorderLayout.CENTER);
        add(btnPanel, BorderLayout.PAGE_START);
    }

    private static void createAndShowGui() {
        LayoutTest mainPanel = new LayoutTest();

        JFrame frame = new JFrame("Layout Test");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

@SuppressWarnings("serial")
class LayoutPanel extends JPanel {
    private static final Color BG = Color.BLACK;
    private int sides = 5;
    private static final int INNER_GAP = 1;
    private static final Color CELL_BG = Color.WHITE;

    public LayoutPanel(int cellWidth, int sides) {
        setBackground(BG);
        setBorder(BorderFactory.createLineBorder(BG));
        this.sides = sides;
        setLayout(new GridLayout(sides, sides, INNER_GAP, INNER_GAP));
        Dimension cellDim = new Dimension(cellWidth, cellWidth);
        for (int i = 0; i < sides * sides; i++) {
            JLabel label = new JLabel(".", SwingConstants.CENTER);
            label.setPreferredSize(cellDim);
            label.setBackground(CELL_BG);
            label.setOpaque(true);
            add(label);
        }
    }
}