【问题标题】:Can I set a specific border size for JFrame when it contains GridLayout?当 JFrame 包含 GridLayout 时,我可以为它设置特定的边框大小吗?
【发布时间】:2016-12-18 02:32:47
【问题描述】:

这是一个示例类

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 后,我无法弄清楚如何设置 JPanel 的固定大小。我向它添加了 GridLayout,因为我需要它来显示类似于国际象棋的东西。除了按钮,我不会碰任何东西。 JPanel 是用来查看的。

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

【问题讨论】:

    标签: java swing awt


    【解决方案1】:

    我不确定我是否 100% 理解您的要求,但如果您希望网格周围有空白空间,那么您可能正在寻找一个 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);
            }
        }
    }
    

    【讨论】:

    • 底部的图片是填满整个JFrame的JPanel。我希望 JPanel 不占用整个 JFrame,以便我有一些空间来添加额外的组件,例如按钮
    • @NoobestPros:您需要嵌套 JPanel 来实现此效果,并允许简单地创建复杂的 GUI。请参阅编辑中的代码以回答。
    • 例如,正如@camickr 在我创建此示例时发布的已删除评论中所述,如果您将使用 GridLayout 的 JPanel 嵌套在 BorderLayout 中,则可以创建所需的 GUI。
    • 嵌套就像在 jpanel 上堆叠 jpanel 一样?
    • @NoobestPros:嵌套如我在上面的示例代码中所示。外部 JPanel 使用 BorderLayout,内部 GridLayout 使用 JPanel 在 BorderLayout.CENTER 位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多