Java 无法使swing布局按我所希望的方式工作。

Java 无法使swing布局按我所希望的方式工作。,java,swing,user-interface,layout-manager,Java,Swing,User Interface,Layout Manager,我有一个简单的GUI,我只想让一些文本字段堆叠在一起,每个框都是一个JPanel。我目前正在为JFrame和JPanel使用FlowLayout,但当我最大化时,它会从堆叠变成一行。理想情况下,我希望文本字段保持在窗口的中心,即使其最大化。我正在考虑使用BoxLayout,但在使用上遇到了一些问题 public static Component textbox(String x){ JPanel panel = new JPanel(new FlowLayout(5,5,5));

我有一个简单的GUI,我只想让一些文本字段堆叠在一起,每个框都是一个JPanel。我目前正在为JFrame和JPanel使用FlowLayout,但当我最大化时,它会从堆叠变成一行。理想情况下,我希望文本字段保持在窗口的中心,即使其最大化。我正在考虑使用BoxLayout,但在使用上遇到了一些问题

public static Component textbox(String x){
        JPanel panel = new JPanel(new FlowLayout(5,5,5));
        JLabel lbltAm= new JLabel(x);
        JTextField tftAm = new JTextField(10);
        lbltAm.setFont(new Font("Serif", Font.PLAIN, 14));
        lbltAm.setForeground(Color.white);
        panel.add(lbltAm, BorderLayout.NORTH);
        panel.add(tftAm, BorderLayout.CENTER);
        panel.setBackground(Color.DARK_GRAY);

        Border lowerbevel = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
        panel.setBorder(lowerbevel);

        return panel;
}

private static void createAndShowGUI() {

    //Create and set up the window.


    JFrame frame = new JFrame("Tip Calculator");
    //Add Textbox
    frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS));
    String Label = "Tip Calculator";
    JLabel header = new JLabel(Label);
    header.setFont(new Font("Serif", Font.BOLD, 18));
    frame.add(header);

    frame.add(textbox("Total"));
    frame.add(textbox("Tip %"));
    frame.add(textbox("People"));

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setBackground(Color.gray);
    frame.setPreferredSize(new Dimension(300, 400));
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

在createAndShowGUI中尝试使用GridLayout而不是BoxLayout

frame.setLayout(new GridLayout(4,1));

首先,我不知道为什么在将面板的布局设置为FlowLayout之后,要使用BorderLayout的方法将组件添加到JPanel

如果您希望始终保持组件居中(即使屏幕最大化),FlowLayout可能不是您使用的最佳选项,因为FlowLayout将继续水平放置组件,直到它们填满框架(一行)的宽度,然后开始下一行。因此,如果屏幕尺寸最大化,则每行将有更多组件,并且不会堆叠。我建议使用GridLayout,其中一列如下:

frame.setLayout(new GridLayout(3 *(number of rows/components)*, 1));
您可以对JPanel执行同样的操作。之后,将每个组件的水平对齐设置为居中,如下所示:

component.setHorizontalAlignment(componentName.CENTER);

希望这有帮助

这是一个意见问题,但为了灵活性,我更喜欢使用
GridBagLayout

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;

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.gridwidth = GridBagConstraints.REMAINDER;
            add(textbox("Total"), gbc);
            add(textbox("Tip %"), gbc);
            add(textbox("People"), gbc);
        }

        public Component textbox(String x) {
            JPanel panel = new JPanel(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.insets = new Insets(5, 5, 5, 5);

            JLabel lbltAm = new JLabel(x);
            JTextField tftAm = new JTextField(10);
            lbltAm.setFont(new Font("Serif", Font.PLAIN, 14));
            lbltAm.setForeground(Color.white);

            panel.add(lbltAm, gbc);
            panel.add(tftAm, gbc);
            panel.setBackground(Color.DARK_GRAY);

            Border lowerbevel = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
            panel.setBorder(lowerbevel);

            return panel;
        }
    }

}

或者,如果您希望“盒子”在扩展时占据整个区域,您可以使用类似

    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridwidth = GridBagConstraints.REMAINDER;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.fill = GridBagConstraints.BOTH;
    add(textbox("Total"), gbc);
    add(textbox("Tip %"), gbc);
    add(textbox("People"), gbc);
这会导致类似于

    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridwidth = GridBagConstraints.REMAINDER;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.fill = GridBagConstraints.BOTH;
    add(textbox("Total"), gbc);
    add(textbox("Tip %"), gbc);
    add(textbox("People"), gbc);


请查看,有关更多详细信息,请回答您的问题!哦,是的,就是这么做的。当然,似乎总是一个答案引出另一个答案。好吧,这是一个错误,但其他16个呢?!?好的,第一个例子更像我想要的。感谢这些例子,我对GUI还是很陌生,所以仍然在尝试处理不同的布局。