使用 GridBagLayout 使 JButtons 大小相等

Making JButtons equal size using GridBagLayout

我想知道是否可以在 GridBagLayout 中设置 JButton 组件的大小,我想要每个按钮中的按钮 "Start" 和 "Quit"其他的,我想把它们做大,大小无关,我想知道大概的步骤。

我尝试了在 Internet 上找到的不同内容(使用其他布局),但最终以更多错误告终。

public class Display implements Runnable
{

    public Display()
    {

    }

    @Override
    public void run() {

        JFrame frame = new JFrame();
        frame.setTitle("Title");
        frame.setPreferredSize(new Dimension(500,700));

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        createComponents(frame.getContentPane());
        frame.pack();
        frame.setVisible(true);
    }

    private void createComponents(Container cont)
    {

        GridBagLayout pane = new GridBagLayout();
        JButton button1 = new JButton("Start");
        JButton button2 = new JButton("Quit");

        button1.setSize(new Dimension(200,200));
        button1.setAlignmentX(Component.CENTER_ALIGNMENT);
        button2.setAlignmentX(Component.CENTER_ALIGNMENT);


        cont.setLayout(pane);
        cont.add(button1);
        cont.add(button2);

    }

    public static void main(String[] args)
    {

        Display d = new Display();
        SwingUtilities.invokeLater(d);

    }
}

How it should look:

正如 Hovercraft Full Of Eels 所述,这非常适合单列 GridLayout。网格布局使所有组件大小相同。提供一些布局组件间距并向包含按钮的面板添加一个较大的空边框,工作就完成了。

..and I want to make them (buttons) bigger

有多种方法可以使按钮变大。例如

  1. 设置更大的字体。
  2. 调用 setMargin(Insets) 以在文本周围添加更多 space。
  3. 使用大图标。
  4. 使文本更长(以增加宽度)。

第三种和第四种方式比较随意。


此示例使用前两个以及按钮周围的空边框以进一步提供 white-space。

查看代码中的注释了解详情。

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class ButtonColumnLayout {

    private JComponent ui = null;
    String[] labels = {"Start", "Stop", "Quit"};
    // adjust numbers to change spacing between button text and button edge
    Insets insets = new Insets(10,40,10,40);

    ButtonColumnLayout() {
        initUI();
    }

    public void initUI() {
        if (ui!=null) return;

        // adjust last two numbers to change spacing between buttons
        ui = new JPanel(new GridLayout(0, 1, 10, 10));
        // adjust numbers to change border around buttons
        ui.setBorder(new EmptyBorder(40,100,40,100));

        for (String s : labels) {
            ui.add(getBigButton(s));
        }
    }

    private final JButton getBigButton(String text) {
        JButton b = new JButton(text);
        // adjust float value to change font size
        b.setFont(b.getFont().deriveFont(25f));
        b.setMargin(insets);

        return b;
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                ButtonColumnLayout o = new ButtonColumnLayout();

                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}