向 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);
}
}
我有一个添加到 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);
}
}