java 使所有按钮大小相同

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11536089/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 05:29:28  来源:igfitidea点击:

Making all button size same

javaswing

提问by Lemon Juice

Please have a look the following code

请看下面的代码

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");
        }
    }

I want to make all the buttons in same size. In here, first one is wider than the second one. I need same width ans hight for both. As you can see, I have used all the availables like setPrefferedSize(), setMaximumSize(), setMinimumSize(), but it is still not working properly. Please help!

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

回答by Guillaume Polet

Here is one way to achieve this using a GridLayout. I also introduced an additional JPanelso that the buttons are not stretched when the JFrameis resized and I chose the GridBagLayoutfor it so that it will center the button panel vertically. There are definitely other ways to solve your issue.

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

One thing you should try to avoid is to force preferred/maximum/minimum sizes. Delegate this to the L&F and the LayoutMananager's.

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

If you call pack()on a JFrame, it is useless to set its size previously, as pack()will change that anyway. Try to make the call to setVisible(true);the last line of your GUI initialization.

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

If you want to understand properly how layout, positioning, sizing, etc... works in Swing, I would strongly recommend to read the tutorial on LayoutManager's.

如果您想正确理解布局、定位、大小调整等...在 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();
            }
        });
    }
}

回答by MadProgrammer

You could create your own layout manager that calculates the max size of all the buttons (probably from the preferred size values) and basically assign the same size (via setSize). You'd of course have to provide positional information as well, but this gives the advantage of providing vertical & horizontal layout options

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

UPDATE

更新

This is the implementation I use, I take no credit for it, as you can see it was authored by Santhosh Kumar. I find it very useful as it not only sizes all the buttons to the same size, but also provides alignment as well. You can find the original post here http://www.jroller.com/santhosh/entry/how_do_you_layout_command

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

/**
* @author Santhosh Kumar - [email protected]
*/
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) {
    }

}

回答by Ictis

  1. Set same dimension for both buttons.
  2. Set maximum and minimum size for both buttons. Now it's only maximum for first and minimum for second. It'll work.
  1. 为两个按钮设置相同的尺寸。
  2. 为两个按钮设置最大和最小尺寸。现在它只有第一个最大值和第二个最小值。它会工作。

回答by Micha?l

maybe it because the dimension is not the same for the setPreferredSize()?

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

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

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