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

Java 当JFrame包含GridLayout时,我可以为它设置特定的边框大小吗?,java,swing,awt,Java,Swing,Awt,这是一个示例类 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.se

这是一个示例类

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);
        }
}
这是它附带的布局类

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;
    }
}
import java.awt.*;
导入javax.swing.*;
公共班级布局{
私人JPanel p;
公共布局(){
p=新JPanel(新网格布局(5,5,1,1));
p、 挫折背景(颜色:黑色);
JLabel[]lbs=新JLabel[5][5];
对于(int i=0;i<5;i++)
对于(int j=0;j<5;j++){
lbs[i][j]=新的JLabel(“.”,JLabel.CENTER);
lbs[i][j].挫折背景(颜色.白色);
lbs[i][j].setOpaque(真);
p、 加上(磅[i][j]);
}
}
公共JComponent getGUI(){
返回p;
}
}
代码的结果如下:

所以,我的问题是,我如何能像上面的图片一样调整固定尺寸?我想以后再添加一些组件,比如上面的按钮。在对JPanel应用GridLayout之后,我不知道如何设置它的固定大小。我向它添加了GridLayout,因为我需要它显示类似于国际象棋的东西。除了按钮,我什么都不会碰。JPanel是供查看的,仅此而已


我应该提到的是,我将把网格中间的点改变成其他符号(例如,或!)来表示5x5空间中的对象。我使用JLabel来表示对象。如果我使用GridBagLayout,所有符号都会在一个区域中挤压在一起。

我不确定我是否100%理解你的要求,但是如果你想要网格周围的空白空间,那么也许你想要的是一个空序,可以通过
BorderFactor.createEmptyBorder(间隙,间隙,间隙,间隙)
其中gap是边框的大小,当然每边的值都是唯一的

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

导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.GridLayout;
导入javax.swing.*;
@抑制警告(“串行”)
公共类LayoutTest扩展了JPanel{
专用静态最终整数单元格_宽度=100;
专用静态最终内部侧=5;
专用静态最终整数间隔=25;
专用静态最终颜色BG=Color.WHITE;
专用布局面板LayoutPanel=新布局面板(单元格宽度,侧面);
公共布局测试(){
退避地(BG);
JPanel btnPanel=新JPanel(新网格布局(1,0,间隙,间隙));
添加(新的JButton(“按钮1”));
添加(新的JButton(“按钮2”));
btnPanel.倒退地面(BG);
setBorder(BorderFactory.createEmptyByOrder(间隙,间隙,间隙));
setLayout(新边界布局(间隙,间隙));
添加(layoutPanel、BorderLayout.CENTER);
添加(btnPanel,BorderLayout.PAGE_START);
}
私有静态void createAndShowGui(){
LayoutTest主面板=新建LayoutTest();
JFrame=新JFrame(“布局测试”);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
调用器(()->createAndShowGui());
}
}
@抑制警告(“串行”)
类LayoutPanel扩展了JPanel{
专用静态最终颜色BG=Color.BLACK;
私有内部侧=5;
专用静态最终int内部_间隙=1;
专用静态最终颜色单元\u BG=Color.WHITE;
公共布局面板(内部单元宽度、内部侧面){
退避地(BG);
setboorder(BorderFactory.createLineBorder(BG));
这个边=边;
setLayout(新网格布局(边、边、内_间隙、内_间隙));
维度cellDim=新维度(cellWidth,cellWidth);
对于(int i=0;i
我不确定我是否100%理解您的要求,但如果您希望网格周围有空的空间,那么您需要的可能是一个空订单,可以通过
BorderFactor.createEmptyBorder(gap,gap,gap,gap)轻松获得
其中gap是边框的大小,当然每边的值都是唯一的

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

导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.GridLayout;
导入javax.swing.*;
@抑制警告(“串行”)
公共类LayoutTest扩展了JPanel{
专用静态最终整数单元格_宽度=100;
专用静态最终内部侧=5;
专用静态最终整数间隔=25;
专用静态最终颜色BG=Color.WHITE;
专用布局面板LayoutPanel=新布局面板(单元格宽度,侧面);
公共布局测试(){
退避地(BG);
JPanel btnPanel=新JPanel(新网格布局(1,0,间隙,间隙));
添加(新的JButton(“按钮1”));
添加(新的JButton(“按钮2”));
btnPanel.倒退地面(BG);
setBorder(BorderFactory.createEmptyByOrder(间隙,间隙,间隙));
setLayout(新边界布局(间隙,间隙));
添加(layoutPanel、BorderLayout.CENTER);
添加(btnPanel,BorderLayout.PAGE_START);
}
私有静态void createAndShowGui(){
LayoutTest主面板=新建LayoutTest();
JFrame=新JFrame(“布局测试”);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationByPlatform(真);
塞维斯框架
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);
        }
    }
}