setLayout() 到 BoxLayout 导致 JPanels 消失

setLayout() to BoxLayout causes JPanels to disappear

这是我的第一个 post,所以如果我没有包含完整描述我的问题所需的所有信息,我提前道歉。

由于在使用 BoxLayout 时遇到挫折,我在显示 JFrame 时遇到了问题。我想创建水平使用框布局来创建两个部分,然后每个部分将再次使用 BoxLayout(垂直)。但是,当我尝试将 JPanel 的布局设置为 BoxLayout 时,面板消失了。此外,我选择的首选尺寸与我给它们的值无关。不是分成 67/33,而是分成 85/15。

我已经尝试更改 JPanel 的布局,但进展甚微。此外,我尝试过调整尺寸,虽然我可以得到我满意的视觉效果,但我仍然想知道为什么我的 67/33 分割在理论上不起作用。

下面是我的代码:

import javax.swing.*;
import java.awt.*;

public class test {

    public static void beginPoS() {
        // instantiating the opening frame
        JFrame openingPage = new JFrame("Point of Sales Simulation");
        openingPage.setSize(750, 600);
        openingPage.setVisible(true);
        openingPage.setLocationRelativeTo(null);
        openingPage.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        openingPage.setResizable(false);
        Container contents = openingPage.getContentPane();
        contents.setLayout(new BorderLayout());

    JPanel overall = new JPanel();
    overall.setLayout(new BoxLayout(overall, BoxLayout.X_AXIS));

    JPanel panel1 = new JPanel();
    panel1.setBackground(Color.RED);
    panel1.setPreferredSize(new Dimension(300, 600));
    panel1.setLayout(new BoxLayout(panel1, BoxLayout.Y_AXIS));

    JPanel panel2 = new JPanel();
    panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
    panel2.setBackground(Color.GREEN);
    panel2.setPreferredSize(new Dimension(50, 600));

    overall.add(panel1);
    overall.add(panel2);

    openingPage.add(overall);

    }

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

}

多个问题:

panel1.setLayout(new BoxLayout(panel1, BoxLayout.Y_AXIS));

JPanel panel2 = new JPanel();
panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));

Box 布局似乎不喜欢您设置了子面板的布局并且没有输入任何组件。

因此每个子面板的首选大小为 (0, 0)。所以它不能增长。

删除上面两个setLayout(...)语句。

Instead of being split into 67/33, the split is rather 85/15.

嗯,你打错了。一个面板的宽度为 50,另一个面板的宽度为 300。

BoxLayout 将首先分配首选space。由于您将帧的大小硬编码为 750,因此您将剩下大约 400 个 space 像素。然后 BoxLayout 将为每个面板分配 200 像素以填充可用的 space.

openingPage.setSize(750, 600);
openingPage.setVisible(true);
openingPage.setLocationRelativeTo(null);
openingPage.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
openingPage.setResizable(false);

上面的代码应该在所有组件都添加到框架之后执行,顺序很重要。它应该更像:

openingPage.setResizable(false);
//openingPage.setSize(750, 600);
openingPage.pack();
openingPage.setVisible(true);
openingPage.setLocationRelativeTo(null);
openingPage.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

通常您应该使用 pack() 而不是 setSize(...) 此布局管理器将以其首选大小显示组件。您希望在打包框架之前设置可调整大小 属性,因为这会影响框架的边框大小。 pack 方法需要该信息。

我建议您查看 Layout Manager 上 Swing 教程中的演示代码。该代码将向您展示如何更好地构建 类,以便在 Event Dispatch Thread (EDT).

上创建 GUI