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

标签 java swing awt

enter image description here

这是一个示例类

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);
        }
}

这是自带的Layout类

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;
    }
}

代码的结果是这样的:

enter image description here

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

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

最佳答案

我不确定我100%理解你在问什么,但如果你想要网格周围的空白空间,那么也许你正在寻找的是一个EmptyBorder,可以通过BorderFactor.createEmptyBorder(gap, gap, gap, gap);轻松获得其中间隙是边框的大小,当然它可以是每一侧的唯一值。

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

enter image description here

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);
        }
    }
}

关于java - 当 JFrame 包含 GridLayout 时,我可以为 JFrame 设置特定的边框大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41204962/

相关文章:

java - 在网格布局中将面板垂直居中定位

java - android HTTP POST 失败

java - 如何在vlcj上暂停和播放视频?

java - 如何在输出中获得 101 三角形?

java - String ReplaceAll 方法不起作用

java - JFrame 中的 JPanel 派生类 - 绘制重复项

Java turtle 图形用户输入

resize - AWT 自定义呈现 - 捕获平滑的调整大小并消除调整大小闪烁

java - 如何在单击按钮时显示文本

java - 有没有办法使用 Eclipse 找出表单的类?