2

请看下面的代码

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

4 回答 4

9

这是使用GridLayout. 我还引入了一个附加功能JPanel,以便在JFrame调整大小时不会拉伸按钮,我为它选择了GridBagLayout,以便它将按钮面板垂直居中。肯定有其他方法可以解决您的问题。

您应该尽量避免的一件事是强制首选/最大/最小尺寸。将此委托给 L&F 和 LayoutManager 的。

如果你调用pack()a JFrame,那么之前设置它的大小是没有用的,因为pack()无论如何都会改变它。尝试调用setVisible(true);GUI 初始化的最后一行。

如果您想正确理解布局、定位、调整大小等在 Swing 中的工作原理,我强烈建议您阅读LayoutManager 的教程

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();
            }
        });
    }
}
于 2012-07-18T07:34:32.677 回答
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) {
    }

}
于 2012-07-18T09:18:17.133 回答
-1
  1. 为两个按钮设置相同的尺寸。
  2. 设置两个按钮的最大和最小尺寸。现在它只有第一个的最大值和第二个的最小值。它会工作的。
于 2012-07-18T07:36:17.503 回答
-2

也许是因为尺寸不一样setPreferredSize()

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

    process.setPreferredSize(new Dimension(100,20));
于 2012-07-18T07:21:05.517 回答