使所有按钮大小相同

时间:2012-07-18 07:14:15

标签: java swing

请查看以下代码

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class GUI extends JFrame
{
    private JButton open, process;
    private JLabel center;
    private JScrollPane scroll;
    private Box box;
    private IplImage image;

    public FirstGUI()
    {
        open = new JButton("Open Image");
        open.setPreferredSize(new Dimension(70,20));
        open.setMaximumSize(new Dimension(100,20));

        open.addActionListener(new OpenImageAction());
        process = new JButton("Process");
        process.setPreferredSize(new Dimension(100,20));
        process.setMinimumSize(new Dimension(100,20));
        process.addActionListener(new ProcessAction());
        System.out.println("Open Size: "+open.getSize()+"      Process size: "+process.getSize());


        box = new Box(BoxLayout.Y_AXIS);
        box.add(open);
        box.add(process);

        center = new JLabel();
        scroll = new JScrollPane(center);

        getContentPane().add(box,"West");
        getContentPane().add(scroll,"Center");

        this.setSize(300,300);
        this.pack();
        this.validate();
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public static void main(String[]args)
    {
        try
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

            new GUI();
        }
        catch(java.lang.Exception e)
        {
            JOptionPane.showMessageDialog(null,"GUI Error");
        }
    }

我想让所有按钮的大小相同。在这里,第一个比第二个宽。我需要两个相同的宽度和高度。如您所见,我已经使用了所有可用的setPrefferedSize(),setMaximumSize(),setMinimumSize(),但它仍然无法正常工作。请帮忙!

4 个答案:

答案 0 :(得分:9)

以下是使用GridLayout实现此目的的一种方法。我还引入了一个额外的JPanel,以便在JFrame调整大小时按钮不会拉伸,我为它选择了GridBagLayout,以便它将按钮面板垂直居中。肯定有其他方法可以解决您的问题。

您应该尽量避免使用强制首选/最大/最小尺寸。将此委托给L& F和LayoutMananager's。

如果您在pack()上致电JFrame,则之前设置其大小毫无用处,因为pack()无论如何都会改变它。尝试调用setVisible(true); GUI初始化的最后一行。

如果您想正确理解布局,定位,大小调整等方式如何在Swing中运行,我强烈建议您阅读the tutorial on LayoutManager's

import java.awt.BorderLayout;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class GUI extends JFrame {
    private JButton open, process;
    private JLabel center;
    private JScrollPane scroll;
    private JPanel box;

    public GUI() {
        open = new JButton("Open Image");
        // open.addActionListener(new OpenImageAction());
        process = new JButton("Process");
        // process.addActionListener(new ProcessAction());

        box = new JPanel(new GridLayout(2, 1));
        box.add(open);
        box.add(process);
        JPanel west = new JPanel(new GridBagLayout());
        west.add(box);

        center = new JLabel("Some center label");
        scroll = new JScrollPane(center);

        getContentPane().add(west, BorderLayout.WEST);
        getContentPane().add(scroll);

        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (java.lang.Exception e) {
            JOptionPane.showMessageDialog(null, "GUI Error");
        }
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new GUI();
            }
        });
    }
}

答案 1 :(得分:2)

您可以创建自己的布局管理器来计算所有按钮的最大大小(可能来自首选大小值),并基本上分配相同的大小(通过setSize)。你当然也必须提供位置信息,但这提供了提供垂直和放大的优势。水平布局选项

<强>更新

这是我使用的实现,我不相信它,因为你可以看到它是由Santhosh Kumar撰写的。我发现它非常有用,因为它不仅将所有按钮的尺寸调整为相同的尺寸,而且还提供对齐。您可以在http://www.jroller.com/santhosh/entry/how_do_you_layout_command

找到原始帖子
/**
* @author Santhosh Kumar - santhosh@in.fiorano.com
*/
public class ButtonLayout implements LayoutManager, SwingConstants {

    protected static Logger logger = Logger.getLogger(ButtonLayout.class);

    private int gap;
    private int alignment;

    public ButtonLayout() {

        setAlignment(RIGHT);
        setGap(2);

    }

    public ButtonLayout(int alignment, int gap) {
        setGap(gap);
        setAlignment(alignment);
    }

    public ButtonLayout(int gap) {
        this(RIGHT, gap);
    }

    public int getAlignment() {
        return alignment;
    }

    public void setAlignment(int alignment) {
        this.alignment = alignment;
    }

    public int getGap() {
        return gap;
    }

    public void setGap(int gap) {
        this.gap = gap;
    }

    private Dimension[] dimensions(Component children[]) {
        int maxWidth = 0;
        int maxHeight = 0;
        int visibleCount = 0;
        Dimension componentPreferredSize;

        for (int i = 0, c = children.length; i < c; i++) {

            if (children[i].isVisible()) {

                componentPreferredSize = children[i].getPreferredSize();
                maxWidth = Math.max(maxWidth, componentPreferredSize.width);
                maxHeight = Math.max(maxHeight, componentPreferredSize.height);
                visibleCount++;

            }

        }

        int usedWidth = 0;
        int usedHeight = 0;

        switch (alignment) {

            case LEFT:
            case RIGHT:
                usedWidth = maxWidth * visibleCount + gap * (visibleCount - 1);
                usedHeight = maxHeight;
                break;

            case TOP:
            case BOTTOM:
                usedWidth = maxWidth;
                usedHeight = maxHeight * visibleCount + gap * (visibleCount - 1);
                break;

        }

        return new Dimension[]{
                            new Dimension(maxWidth, maxHeight),
                            new Dimension(usedWidth, usedHeight),};
    }

    public void layoutContainer(Container container) {

        Insets insets = container.getInsets();
        int width = container.getWidth() - (insets.left + insets.right);
        int height = container.getHeight() - (insets.top + insets.bottom);

        Component[] children = container.getComponents();
        Dimension dim[] = dimensions(children);

        int maxWidth = dim[0].width;
        int maxHeight = dim[0].height;
        int usedWidth = dim[1].width;
        int usedHeight = dim[1].height;

        for (int i = 0, c = children.length; i < c; i++) {

            if (children[i].isVisible()) {

                switch (alignment) {
                    case LEFT:
                        children[i].setBounds(
                                        insets.left + (maxWidth + gap) * i,
                                        insets.top,
                                        maxWidth,
                                        maxHeight);
                        break;
                    case TOP:
                        children[i].setBounds(
                                        insets.left + ((width - maxWidth) / 2),
                                        insets.top + (maxHeight + gap) * i,
                                        maxWidth,
                                        maxHeight);
                        break;
                    case RIGHT:
                        children[i].setBounds(
                                        width - insets.right - usedWidth + (maxWidth + gap) * i,
                                        insets.top,
                                        maxWidth,
                                        maxHeight);
                        break;
                    case BOTTOM:
                        children[i].setBounds(
                                        insets.left + (maxWidth + gap) * i,
                                        height - insets.bottom - usedHeight + (maxHeight + gap) * i,
//                                      insets.top,
                                        maxWidth,
                                        maxHeight);
                        break;
                }

            }

        }

    }

    public Dimension minimumLayoutSize(Container c) {
        return preferredLayoutSize(c);
    }

    public Dimension preferredLayoutSize(Container container) {

        Insets insets = container.getInsets();

        Component[] children = container.getComponents();
        Dimension dim[] = dimensions(children);

        int usedWidth = dim[1].width;
        int usedHeight = dim[1].height;

        return new Dimension(
                        insets.left + usedWidth + insets.right,
                        insets.top + usedHeight + insets.bottom);
    }

    public void addLayoutComponent(String string, Component comp) {
    }

    public void removeLayoutComponent(Component c) {
    }

}

答案 2 :(得分:-1)

  1. 为两个按钮设置相同的尺寸。
  2. 设置两个按钮的最大和最小尺寸。现在它只是第一个和第二个的最小值。 它会工作。

答案 3 :(得分:-2)

也许是因为setPreferredSize()的维度不一样了?

    open.setPreferredSize(new Dimension(70,20));

    process.setPreferredSize(new Dimension(100,20));