Java 面板忽略 setSize

Java Panel ignores setSize

我遇到了与 here 描述的相同问题,但 none 的答案对我有用。

我有一个 Panel 和一个 BoxLayoutAxis = Y Axes,因为我想将一个元素堆叠在另一个下面,但我希望能够对齐元素向右和向左,所以现在我要插入此面板和其他面板:

arrayList.forEach(message -> {
    JLabel label = new JLabel("[" + message.getSender() + " " + message.when() + "] : " + message.message(), SwingConstants.LEFT);
    Panel panel = null;
    try {
        panel = new Panel(new FlowLayout(message.getSender().equals(this.client.getName()) ? FlowLayout.LEFT : FlowLayout.RIGHT));
        panel.add(label);
        panel.setSize(panel.getSize().width, label.getPreferredSize().height);
        panel.setPreferredSize(new Dimension(panel.getSize().width, label.getPreferredSize().height));
        label.setBackground(message.getSender().equals(client.getName()) ? Color.GREEN : Color.BLUE);
        label.setForeground(message.getSender().equals(client.getName()) ? Color.BLACK : Color.WHITE);
    } catch (RemoteException ex) {
        ex.printStackTrace();
    }
    label.setOpaque(true);
    chat.add(panel, BorderLayout.PAGE_START);
});

但是这不起作用,因为结果如下:

然而,假设的结果应该是一条消息在另一条消息下方,消息之间没有任何类型的 space...我错过了什么?

chat.add(panel, BorderLayout.PAGE_START);

这种说法没有道理。当您的问题表明您正在使用 BoxLayout 时,这意味着您正在使用 BorderLayout。使用 BoxLayout 时,您无需指定约束。

I have a Panel with a BoxLayout with Axis = Y Axes,

BoxLayout 遵循组件的最大尺寸。

因此,当父面板中有额外的 space 时,每个子面板都会增长,直到使用所有额外的 space。

不要玩弄尺寸或首选尺寸方法。

一种解决方案是使用符合所有子面板首选高度的包装面板。

所以你的代码应该是这样的:

Box chat = Box.createVerticalBox();

JPanel wrapper = new JPanel( new BorderLayout() );
wrapper.add(chat, BorderLayout.PAGE_START);

frame.add(wrapper, BorderLayout.CENTER);

现在“聊天”面板的高度将遵循添加到其中的每个组件的首选高度。