【问题标题】:BorderLayout doesn't honor maximumsizeBorderLayout 不尊重最大尺寸
【发布时间】:2016-05-22 04:19:54
【问题描述】:

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

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

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

【问题讨论】:

  • 将蓝色面板添加到使用GridBagLayout 的面板中。在BoxLayout.CENTER 添加GBL 面板。 GBL 面板将被拉伸,但应遵循蓝色面板的首选尺寸。

标签: java swing layout layout-manager boxlayout


【解决方案1】:

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

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

在此示例中,我将名为 centerPanelJPanel 添加到 BorderLayout.CENTER,它使用标准 GridBagLayout(将添加的组件居中)。然后我将名为panel 的附加JPanel 添加到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();
            }
        });
    }

}

【讨论】:

    【解决方案2】:

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

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

    还可以考虑使用Box,而不是JPanel 具有BoxLayout

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      相关资源
      最近更新 更多