BorderLayout不尊重maximumsize

Ava*_*nDE 1 java layout swing layout-manager boxlayout

我有一个问题BorderLayout,但首先,这是我的GUI设置:

在此输入图像描述

如你所见,我内部有3个不同的组件JFrame.添加JMenuJList工作正常.但我JPanel应该有一个固定的大小,所以我想阻止我BorderLayout拉伸面板.我尝试了一切,setPreferredSize() setMinimumSize() setMaximumSize() setSize()但布局再次拉伸我的面板以适应框架.(使用面板添加到框架中BorderLayout.CENTER).

有没有办法阻止这个或你有其他建议来管理这个问题?

Luk*_*ter 5

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

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

在这个例子中,我添加了JPanel被调用centerPanel,它使用标准GridBagLayout(以添加的组件为中心)BorderLayout.CENTER.然后,我添加了额外的JPanelpanel,里面有一个自定义的preferrdSize,对centerPanel.这种方式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();
            }
        });
    }

}
Run Code Online (Sandbox Code Playgroud)