Java 边框布局不';不尊重最大尺寸

Java 边框布局不';不尊重最大尺寸,java,swing,layout,layout-manager,boxlayout,Java,Swing,Layout,Layout Manager,Boxlayout,我在使用BorderLayout时遇到问题,但首先,这里是我的GUI设置: 如您所见,我的JFrame中有3个不同的组件。添加JMenu和JList效果很好。但是我的JPanel应该有一个固定大小,因此我想防止我的BorderLayout拉伸面板。我尝试了一切,setPreferredSize()setMinimumSize()setMaximumSize()setSize(),但布局再次拉伸我的面板以适合框架。(使用BorderLayout.CENTER将面板添加到框架中) 有什么方法可以防

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

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


有什么方法可以防止这种情况发生,或者你有其他建议来处理这个问题吗?

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

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

在本例中,我将名为
centerPanel
JPanel
添加到
BorderLayout.center
,该面板使用标准
GridBagLayout
(以使添加的组件居中)。然后我将名为
panel
的附加
JPanel
添加到
中心面板
,该面板具有自定义的
preferrdSize
。这样
面板就不会拉伸


代码:

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();
            }
        });
    }

}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.GridBagLayout;
导入javax.swing.BorderFactory;
导入javax.swing.BoxLayout;
导入javax.swing.DefaultListModel;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JList;
导入javax.swing.JMenu;
导入javax.swing.JMenuBar;
导入javax.swing.JPanel;
公开课范例{
公共示例(){
JMenuBar menuBar=新的JMenuBar();
menuBar.setBorder(BorderFactory.CreateMateBorder(0,0,1,0,Color.BLACK));
DefaultListModel listModel=新的DefaultListModel();
JList list=新的JList(listModel);
setboorder(BorderFactory.createMatteBorder(0,0,0,1,Color.BLACK));
JPanel面板=新的JPanel(){
@凌驾
公共维度getPreferredSize(){
返回新维度(400400);
}
//如果您还想阻止
//面板的“包装”。
/*
*@Override public Dimension getMinimumSize(){return new
*维数(400400);}
*/
};
panel.setLayout(新的BoxLayout(panel,BoxLayout.Y_轴));
panel.setOrder(BorderFactory.createLineBorder(Color.BLUE));

对于(int i=1;i我很确定您的意思是
BorderLayout
,而不是
BoxLayout
,因为没有
BoxLayout.CENTER
,看起来您使用
BorderLayout
来放置组件

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

在本例中,我添加了名为
centerPanel
JPanel
,该面板使用标准的
GridBagLayout
(以使添加的组件居中),添加到
BorderLayout.CENTER
。然后,我将另一个名为
panel
JPanel
添加到
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();
            }
        });
    }

}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.GridBagLayout;
导入javax.swing.BorderFactory;
导入javax.swing.BoxLayout;
导入javax.swing.DefaultListModel;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JList;
导入javax.swing.JMenu;
导入javax.swing.JMenuBar;
导入javax.swing.JPanel;
公开课范例{
公共示例(){
JMenuBar menuBar=新的JMenuBar();
menuBar.setBorder(BorderFactory.CreateMateBorder(0,0,1,0,Color.BLACK));
DefaultListModel listModel=新的DefaultListModel();
JList list=新的JList(listModel);
setboorder(BorderFactory.createMatteBorder(0,0,0,1,Color.BLACK));
JPanel面板=新的JPanel(){
@凌驾
公共维度getPreferredSize(){
返回新维度(400400);
}
//如果您还想阻止
//面板的“包装”。
/*
*@Override public Dimension getMinimumSize(){return new
*维数(400400);}
*/
};
panel.setLayout(新的BoxLayout(panel,BoxLayout.Y_轴));
panel.setOrder(BorderFactory.createLineBorder(Color.BLUE));

对于(int i=1;i将现有的
JPanel
添加到
JPanel
具有
Flowlayout
、默认值或具有
GridBagLayout
默认约束的
JPanel。将此面板添加到框架的中心,
BorderLayout.center

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

也可以考虑使用<代码> box <代码>,而不是<代码> jPuth<代码> < <代码> BoxLayout < /C> > < /P>


还考虑使用框架<代码> StjMunuBar()/<代码>,而不是<代码>添加(BoDeDayStay.PaGyStEnter)

将现有的
JPanel
添加到一个
JPanel
具有默认的
Flowlayout
,或具有默认约束的
GridBagLayout
。将此面板添加到框架的中心,默认情况下,
BorderLayout.center

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