BorderLayout 不支持最大尺寸

BorderLayout doesn't honor maximumsize

我在使用 BorderLayout 时遇到问题,但首先,这是我的 GUI 设置:

如您所见,我的 JFrame 内有 3 个不同的组件。添加 JMenuJList 效果很好。但是我的 JPanel 应该有一个 固定大小 所以我想防止我的 BorderLayout 拉伸面板。我尝试了一切,setPreferredSize() setMinimumSize() setMaximumSize() setSize() 但布局再次拉伸我的面板以适应框架。 (使用 BorderLayout.CENTER 将面板添加到框架中)。

有什么方法可以防止这种情况发生,或者您有其他解决问题的建议吗?

我很确定你的意思是 BorderLayout,而不是 BoxLayout,因为没有 BoxLayout.CENTER,而且看起来你使用 BorderLayout 来放置组件.

我认为这里的问题是您只设置了添加到 BorderLayout.CENTER 的面板的首选大小。这没有任何作用。相反,您需要嵌套布局。

在此示例中,我将名为 centerPanelJPanel 添加到 BorderLayout.CENTER,它使用标准 GridBagLayout(将添加的组件居中)。然后我将另一个名为 panelJPanel 添加到 centerPanel,它有一个自定义的 preferrdSize。这样 panel 就不会被拉长。


代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;

public class Example {

    public Example() {
        JMenuBar menuBar = new JMenuBar();
        menuBar.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK));

        DefaultListModel<String> listModel = new DefaultListModel<String>();
        JList<String> list = new JList<String>(listModel);
        list.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.BLACK));

        JPanel panel = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 400);
            }
            // Uncomment the following lines if you also want to prevent the
            // 'wrapping' of the panel.
            /*
             * @Override public Dimension getMinimumSize() { return new
             * Dimension(400, 400); }
             */
        };
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setBorder(BorderFactory.createLineBorder(Color.BLUE));

        for (int i = 1; i <= 5; i++) {
            menuBar.add(new JMenu("Menu " + i));
            listModel.addElement("Element " + i);
            panel.add(new JLabel("Label " + i));
        }

        JPanel centerPanel = new JPanel(new GridBagLayout());
        centerPanel.add(panel);

        JPanel contentPanel = new JPanel(new BorderLayout());
        contentPanel.add(menuBar, BorderLayout.NORTH);
        contentPanel.add(list, BorderLayout.WEST);
        contentPanel.add(centerPanel);

        JFrame frame = new JFrame();
        frame.setContentPane(contentPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Example();
            }
        });
    }

}

将您现有的 JPanel 添加到具有 Flowlayout 默认值或具有默认约束的 GridBagLayoutJPanel。将此面板添加到框架的中心,默认为 BorderLayout.CENTER

Panel centerPane = new Panel(new GridBagLayout())`;
centerPane.add(yourJPanel);
frame.add(centerPane, BorderLayout.CENTER);

也可以考虑使用 Box,而不是具有 BoxLayoutJPanel

也可以考虑使用框架的 setJMenuBar(),而不是 add(BorderLayout.PAGE_START)