Java 如何设置不同于按钮间距的边距?

Java 如何设置不同于按钮间距的边距?,java,swing,Java,Swing,我有一个按钮面板,我想在按钮之间留出25px的空间,右边距为5px,左边距为5px(右边的按钮位于窗口边框的5个像素处) 流布局在所有位置设置相同大小的间隙。Gridlayout允许这样做,但是所有的按钮都有相同的大小,这不是我想要的。我找到的唯一解决方案是将流程布局设置为hgap=0。然后我有一个空的边缘,每个按钮前都有一个刚性区域,但我认为这个解决方案是一个糟糕的做法 最好的解决方案是什么 import java.awt.BorderLayout; import java.awt.Conta

我有一个按钮面板,我想在按钮之间留出25px的空间,右边距为5px,左边距为5px(右边的按钮位于窗口边框的5个像素处)

流布局在所有位置设置相同大小的间隙。Gridlayout允许这样做,但是所有的按钮都有相同的大小,这不是我想要的。我找到的唯一解决方案是将流程布局设置为hgap=0。然后我有一个空的边缘,每个按钮前都有一个刚性区域,但我认为这个解决方案是一个糟糕的做法

最好的解决方案是什么

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FlowLayoutDemo extends JFrame{
    FlowLayout experimentLayout = new FlowLayout(FlowLayout.LEFT, 25, 0);

    public FlowLayoutDemo(String name) {
        super(name);
    }

    public void addComponentsToPane(final Container pane) {
        final JPanel compsToExperiment = new JPanel();
        compsToExperiment.setLayout(experimentLayout);
        experimentLayout.setAlignment(FlowLayout.TRAILING);
        compsToExperiment.add(new JButton("Button 1"));
        compsToExperiment.add(new JButton("Button 2"));
        compsToExperiment.add(new JButton("Button 3"));
        compsToExperiment.add(new JButton("Long-Named Button 4"));
        compsToExperiment.add(new JButton("5"));
        pane.add(compsToExperiment, BorderLayout.CENTER);
    }

    private static void createAndShowGUI() {
        FlowLayoutDemo frame = new FlowLayoutDemo("FlowLayoutDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.addComponentsToPane(frame.getContentPane());
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

考虑改用
GridBagLayout
,它提供了更多的控制和定制

有关更多详细信息,请参阅

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridy = 0;
            gbc.insets = new Insets(5, 5, 5, 25);
            gbc.fill = gbc.HORIZONTAL;
            gbc.weightx = 1;

            add(new JButton("Button 1"), gbc);
            gbc.insets = new Insets(5, 0, 5, 25);
            add(new JButton("Button 2"), gbc);
            add(new JButton("Button 3"), gbc);
            add(new JButton("Long-Named Button 4"), gbc);
            gbc.insets = new Insets(5, 0, 5, 5);
            add(new JButton("5"), gbc);
        }

    }

}

注意,该示例强制按钮也占用所有可用空间。如果这不能满足您的特殊需要,请尝试使用
fill
weightx
值,最好的方法是使用
GridBagLayout
,如程序员示例所示。但也可以使用
FlowLayout
。以下是一个例子:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FlowLayoutDemo extends JFrame {
    FlowLayout experimentLayout = new FlowLayout(FlowLayout.LEFT, 5, 0);

    public FlowLayoutDemo(String name) {
        super(name);
    }

    public void addComponentsToPane(final Container pane) {
        final JPanel compsToExperiment = new JPanel();
        compsToExperiment.setLayout(experimentLayout);
        experimentLayout.setAlignment(FlowLayout.TRAILING);
        compsToExperiment.add(new JButton("Button 1"));
        compsToExperiment.add(Box.createHorizontalStrut(20));
        compsToExperiment.add(new JButton("Button 2"));
        compsToExperiment.add(Box.createHorizontalStrut(20));
        compsToExperiment.add(new JButton("Button 3"));
        compsToExperiment.add(Box.createHorizontalStrut(20));
        compsToExperiment.add(new JButton("Long-Named Button 4"));
        compsToExperiment.add(Box.createHorizontalStrut(20));
        compsToExperiment.add(new JButton("5"));
        pane.add(compsToExperiment, BorderLayout.CENTER);
    }

    private static void createAndShowGUI() {
        FlowLayoutDemo frame = new FlowLayoutDemo("FlowLayoutDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.addComponentsToPane(frame.getContentPane());
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

如果您想变得棘手,因此不需要使用GridBagLayout的所有约束或添加填充组件,您可以执行以下操作:

JPanel compsToExperiment = new JPanel(experimentLayout);
compsToExperiment.setBorder( new EmptyBorder(0, -20, 0, -20) );
这有效地减少了面板左/右边缘周围20个像素的空间

另外,我只想指出,您有:

FlowLayout experimentLayout = new FlowLayout(FlowLayout.LEFT, 25, 0);

...

experimentLayout.setAlignment(FlowLayout.TRAILING);
将布局设置为“左对齐”,然后将其更改为“尾随”。这有点令人困惑。创建布局时,只需将其设置为trailing:

FlowLayout experimentLayout = new FlowLayout(FlowLayout.TRAILING, 25, 0);