向 JPanel 添加边框会影响添加到面板的组件的布局

Adding border to JPanel impacts the layout of the components added to the panel

我有一个添加到 JFrame 的 JPanel。该面板有许多垂直添加的按钮。当我给面板设置边框时,按钮的尺寸变小了,布局也乱了。

谁能告诉我为什么布局会因为边框设置而受到影响?

添加边框之前

添加边框后

以下是上述设计的代码

frame = new JFrame();
    //frame.setBounds(100, 100, 450, 300);
    frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(new BorderLayout(0, 0));

    JPanel actionPanel = new JPanel();
    actionPanel.setPreferredSize(new Dimension(200, 450));
    actionPanel.setBackground(Color.BLUE);
    frame.getContentPane().add(actionPanel, BorderLayout.WEST);
    actionPanel.setLayout(new GridLayout(2, 1, 0, 0));

    JPanel panel = new JPanel();
    panel.setBorder(BorderFactory.createLineBorder(Color.GRAY));
    //panel.setBackground(Color.GRAY);
    actionPanel.add(panel);
    panel.setLayout(new GridBagLayout());

    //GridbagLayout constraints
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.weighty = 0;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.anchor = GridBagConstraints.FIRST_LINE_START;

    JButton btnPos = new JButton("Point of Sale");
    Dimension btnPosDimension = new Dimension(actionPanel.getPreferredSize().width, 40);
    btnPos.setPreferredSize(btnPosDimension);
    panel.add(btnPos, gbc);

    gbc.gridy++;        
    JButton btnCategory = new JButton("Category");
    btnCategory.setPreferredSize(btnPosDimension);
    panel.add(btnCategory, gbc);

    gbc.gridy++;        
    JButton btnProduct = new JButton("Product");
    btnProduct.setPreferredSize(btnPosDimension);
    panel.add(btnProduct, gbc);

    gbc.gridy++;        
    JButton btnVendor = new JButton("Vendor");
    btnVendor.setPreferredSize(btnPosDimension);
    panel.add(btnVendor, gbc);

    gbc.weighty = 1;
    gbc.gridy++;
    panel.add(Box.createGlue(), gbc); //Adding a component to feel the area.

    JPanel panel_1 = new JPanel();
    actionPanel.add(panel_1);


    JPanel contentPanel = new JPanel();
    frame.getContentPane().add(contentPanel, BorderLayout.CENTER);

边框被添加到 JPanel 的内部,因此内部可用的 space 较少。您已经指定了容纳面板的容器的大小,因此当添加边框时没有足够的 space 容纳内容。

我只是减少了按钮的宽度 2。因为那 2 使用了边框。

这是工作代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Example {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        //frame.setBounds(100, 100, 450, 300);
        frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new BorderLayout(0, 0));

        JPanel actionPanel = new JPanel();
        actionPanel.setPreferredSize(new Dimension(200, 450));
        actionPanel.setBackground(Color.BLUE);
        frame.getContentPane().add(actionPanel, BorderLayout.WEST);
        actionPanel.setLayout(new GridLayout(2, 1, 0, 0));

        JPanel panel = new JPanel();
        panel.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        //panel.setBackground(Color.GRAY);
        actionPanel.add(panel);
        panel.setLayout(new GridBagLayout());

        //GridbagLayout constraints
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weighty = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;

        JButton btnPos = new JButton("Point of Sale");
        Dimension btnPosDimension = new Dimension(actionPanel.getPreferredSize().width - 2, 40);
        btnPos.setPreferredSize(btnPosDimension);
        panel.add(btnPos, gbc);

        gbc.gridy++;        
        JButton btnCategory = new JButton("Category");
        btnCategory.setPreferredSize(btnPosDimension);
        panel.add(btnCategory, gbc);

        gbc.gridy++;        
        JButton btnProduct = new JButton("Product");
        btnProduct.setPreferredSize(btnPosDimension);
        panel.add(btnProduct, gbc);

        gbc.gridy++;        
        JButton btnVendor = new JButton("Vendor");
        btnVendor.setPreferredSize(btnPosDimension);
        panel.add(btnVendor, gbc);

        gbc.weighty = 1;
        gbc.gridy++;
        panel.add(Box.createGlue(), gbc); //Adding a component to feel the area.

        JPanel panel_1 = new JPanel();
        actionPanel.add(panel_1);


        JPanel contentPanel = new JPanel();
        frame.getContentPane().add(contentPanel, BorderLayout.CENTER);

        frame.setVisible(true);
    }


}