繁体   English   中英

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

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

在此处输入图片说明

这是一个示例类

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

代码的结果是这样的:

在此处输入图片说明

因此,我的问题是如何像上面的图像那样调整固定大小? 我想稍后再添加类似按钮的组件。 在将GridLayout应用于JPanel后,我无法弄清楚如何设置其固定大小。 我向其中添加了GridLayout,因为我需要它来显示类似于国际象棋的东西。 除了按钮,我什么都不会触摸。 JPanel仅用于视图。

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

我不确定我是否100%理解您的要求,但是如果您想要在网格周围留空,那么您正在寻找的是EmptyBorder,可以通过BorderFactor.createEmptyBorder(gap, gap, gap, gap); 其中差距是边界的大小,当然可以是每一边的唯一值。

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

在此处输入图片说明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM