如何使用BoxLayout设置容器内部的组件大小

问题描述 投票:9回答:3

我在使用BoxLayout时遇到问题。

在我的示例中,我尝试减小文本字段的高度并更改按钮的宽度(如底部图片中的绿色标记所示)。我知道技术setPreferredSize()setMaximumSize(),但是它没有按预期的方式工作。 add(Box.createHorizontalGlue())行也没有帮助。

感谢任何想法。


public class Testy extends JPanel {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                constructGUI();
            }
        });
    }

    private static void constructGUI() {
        JFrame frame = new JFrame("Testy");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JPanel centerPanel = new JPanel();
        centerPanel.setBackground(Color.DARK_GRAY);
        centerPanel.setPreferredSize(new Dimension(100, 400));
        frame.add(centerPanel, BorderLayout.CENTER);

        Testy eastPanel = new Testy();
        frame.add(eastPanel, BorderLayout.EAST);

        frame.pack();
        frame.setVisible(true);
    }

    public Testy() {
        setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));

        JButton button = new JButton("Button ...... 1");
        //button.setPreferredSize(...);
        //button.setMaximumSize(...);
        add(button);

        button = new JButton("Button 2");
        //button.setPreferredSize(...);
        //button.setMaximumSize(...);
        add(button);

        button = new JButton("Button ........... 3");
        //button.setPreferredSize(...);
        //button.setMaximumSize(...);
        add(button);

        JLabel label = new JLabel("Label");
        //label.setPreferredSize(...);
        //label.setMaximumSize(...);
        add(label);

        JTextField textField = new JTextField();
        //textField.setPreferredSize(...);
        //textField.setMaximumSize(...);
        add(textField);

        button = new JButton("Button 4");
        //button.setPreferredSize(...);
        //button.setMaximumSize(...);
        add(button);

        //add(Box.createHorizontalGlue());
    }
}

“

java swing layout layout-manager boxlayout
3个回答
26
投票

首先,您必须意识到Java Swing中组件的位置和大小取决于布局管理器(如果设置了布局管理器),而不取决于组件本身。该组件要求经理提供尺寸。

在这种情况下,我将使用不同的布局-GridLayout和BorderLayout的组合就足够了,而且非常简单明了。但是,如果要使用BoxLayout,则...

  1. 文档说:

    BoxLayout注意到组件要求的最小,首选和最大尺寸。在微调布局时,可能需要调整这些大小。 ...例如,按钮的最大尺寸通常为与其首选尺寸相同。如果您希望将按钮绘制得更宽当有更多空间可用时,则需要更改其最大尺寸。

  2. 然后设置组件的最大大小:c.setMaximumSize(new Dimension(Integer.MAX_VALUE, c.getMinimumSize().height));(在您的示例中,c表示buttonlabeltextField

编辑1:

这里是有效的源代码:

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

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class Testy extends JPanel {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                constructGUI();
            }
        });
    }

    private static void constructGUI() {
        JFrame frame = new JFrame("Testy");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JPanel centerPanel = new JPanel();
        centerPanel.setBackground(Color.DARK_GRAY);
        centerPanel.setPreferredSize(new Dimension(100, 400));
        frame.add(centerPanel, BorderLayout.CENTER);

        Testy eastPanel = new Testy();
        frame.add(eastPanel, BorderLayout.EAST);

        frame.pack();
        frame.setVisible(true);
    }

    public Testy() {
        setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));

        JButton button = new JButton("Button ...... 1");
        //button.setPreferredSize(...);
        button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
        add(button);

        button = new JButton("Button 2");
        //button.setPreferredSize(...);
        button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
        add(button);

        button = new JButton("Button ........... 3");
        //button.setPreferredSize(...);
        button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
        add(button);

        JLabel label = new JLabel("Label");
        //label.setPreferredSize(...);
        label.setMaximumSize(new Dimension(Integer.MAX_VALUE, label.getMinimumSize().height));
        add(label);

        JTextField textField = new JTextField();
        //textField.setPreferredSize(...);
        textField.setMaximumSize(new Dimension(Integer.MAX_VALUE, textField.getMinimumSize().height));
        add(textField);

        button = new JButton("Button 4");
        //button.setPreferredSize(...);
        button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
        add(button);

        // add(Box.createVerticalGlue());
    }
}

“截图”

编辑2:

如果要布置右列底部的按钮4,请在add(Box.createVerticalGlue());add(textField);之间添加此行button = new JButton("Button 4");


4
投票

作为一种快速的补救方法,可以使用嵌套布局,即在右侧,用JPanel创建BorderLayout,在JPanel(say compPanel)处放置CENTER,在[[ C0]位置。现在,将新的JPanel(say buttonPanel)PAGE_END一起使用,并将所有组件放在其上,然后将此JPanel(say panel)放在GridLayout内。将compPanel照原样放置在centerPanel内。

JButton(button4)相反,相对于给定buttonPanel的首选大小,该大小通常是基于BoxLayout持有或明确给出的内容来计算的,因此,组件相对于其他给定给定的大小趋向于不太对齐组件。

这里是工作示例:

JComponent

输出:

“布局示例”


1
投票

根据您的绘图,这应该很接近,只需要在该组件上工作即可在JLabel下方(使用setPreferredSize()):

JComponent
© www.soinside.com 2019 - 2024. All rights reserved.