BoxLayout 误区支柱

has*_*bal 4 java swing boxlayout

我正在用 Swing 编写一个简单的输入图。我使用 boxLayout 创建一个简单的用户输入 GUI。问题是在所有标签的 JPanel 和 JTextFields 的 JPanel 之间创建水平支柱会导致整个面板向下移动(奇怪)这是整个面板:

private JPanel secondCard() {

    //main panel. set the boxlayout
    secondCard = new JPanel();
    secondCard.setLayout(new BoxLayout(secondCard,BoxLayout.Y_AXIS));

    // create vertical strut for looks
    secondCard.add(Box.createVerticalStrut(20));

    // create title. center it.
    JLabel title = new JLabel("Configure main network parameters "); 
    title.setAlignmentX(CENTER_ALIGNMENT);
    secondCard.add(title);

    // create vertical strut for looks
    secondCard.add(Box.createVerticalStrut(20));

    // create panel for the description labels
    JPanel labelPanel = new JPanel();
    labelPanel.setLayout(new BoxLayout(labelPanel,BoxLayout.Y_AXIS));
    labelPanel.setAlignmentX(LEFT_ALIGNMENT);

    JLabel inPut =new JLabel("number of inputs");
    inPut.setAlignmentX(LEFT_ALIGNMENT);
    labelPanel.add(inPut);

    inPut =new JLabel("number of outputs");
    inPut.setAlignmentX(LEFT_ALIGNMENT);
    labelPanel.add(inPut);

    inPut =new JLabel("number of layers");
    inPut.setAlignmentX(LEFT_ALIGNMENT);
    labelPanel.add(inPut);

    JPanel textFieldPanel = new JPanel();
    textFieldPanel.setLayout(new BoxLayout(textFieldPanel,BoxLayout.Y_AXIS));
    textFieldPanel.setAlignmentX(LEFT_ALIGNMENT);

    JTextField inputTextField = new JTextField();
    inputTextField.setAlignmentX(LEFT_ALIGNMENT);
    textFieldPanel.add(inputTextField);
    inputTextField.setMinimumSize(new Dimension(0,0));

    inputTextField = new JTextField();
    inputTextField.setAlignmentX(LEFT_ALIGNMENT);
    textFieldPanel.add(inputTextField);
    inputTextField.setMinimumSize(new Dimension(0,0));

    inputTextField = new JTextField();
    inputTextField.setAlignmentX(LEFT_ALIGNMENT);
    textFieldPanel.add(inputTextField);
    inputTextField.setMinimumSize(new Dimension(0,0));

    textFieldPanel.setMaximumSize(new Dimension(50, labelPanel.getMaximumSize().height));

    JPanel inputPanel = new JPanel();
    inputPanel.setLayout(new BoxLayout(inputPanel,BoxLayout.X_AXIS));
    inputPanel.setAlignmentX(CENTER_ALIGNMENT);

    inputPanel.add(labelPanel);

    //this is the problem strut!! it causes inputPanel to shift downwards 
    inputPanel.add(Box.createHorizontalStrut(20));

    inputPanel.add(textFieldPanel);

    secondCard.add(inputPanel);

    return secondCard;
}
Run Code Online (Sandbox Code Playgroud)

没有支柱它看起来像: 在此处输入图片说明

使用 strut 它看起来像(我知道我很擅长图片编辑):

在此处输入图片说明

ama*_*ent 5

要添加一个Box支柱的BoxLayout

正如javadoc所述,createHorizontalStrut(int width)

创建一个不可见的、固定宽度的组件。在水平盒子中,您通常使用此方法在两个组件之间强制留出一定量的空间。在垂直框中,您可以使用此方法强制框至少为指定的宽度。除非有多余空间可用,否则不可见组件没有高度,在这种情况下,它会占用可用空间的份额,就像任何其他没有最大高度的组件一样。

因此,它会填充标题JLabel和 .html 文件底部之间的高度JPanel

您可能需要考虑使用Box.createRigidArea(new Dimension(20, height)),其中高度可以指定或设置为labelPanel.

或者,您可以重新考虑您的布局JPanel- 查看视觉指南

为了将来参考,如果您无法理解您的 Swing 布局,请尝试LineBorderJComponent您不确定的s添加一个颜色。在这种情况下,Box支柱不是JComponents 而是Components,因此您必须将它们放入 a 中JPanel,但这至少可以向您显示每个组件在顶级JPanel.