为什么 BoxLayout 占用额外 space?

Why BoxLayout is taking extra space?

我正在开发一个客户端-服务器聊天应用程序,我正在尝试创建 Speech Bubble,就像我们在 WhatsApp 中所做的那样

我想在框架的右侧显示已发送的消息,在框架的左侧显示已接收的消息,我正在尝试使用 BoxLayout 来实现此目的,但需要额外的 space(如下图)

这是我到目前为止所做的

a1.setLayout(new BoxLayout(a1, BoxLayout.Y_AXIS));
JPanel p1 = new JPanel(new FlowLayout(FlowLayout.RIGHT));
JPanel p2 = new JPanel(new FlowLayout(FlowLayout.LEFT));

你在两条消息之间看到的额外 space 是因为我正在使用 BoxLayout
在这种情况下该怎么办?以及任何替代方案我们如何通过不使用 BoxLayout?

来实现这一目标

因此 FlowLayout 遵循首选高度,但它也遵循首选宽度。

相反,您需要一个布局:

  1. 尊重您添加到 BoxLayout 的组件的高度
  2. 填充可用 space 的宽度。

您可以为此使用 BorderLayout

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

public class SSCCE extends JPanel
{
    public SSCCE()
    {
        setLayout( new BorderLayout() );

        Box vertical = Box.createVerticalBox();
        add(vertical, BorderLayout.PAGE_START);

        for (int i = 0; i < 10; i++)
        {
            JPanel left = new JPanel( new BorderLayout() );
            left.add(new JLabel("left message " + i), BorderLayout.LINE_START);
            vertical.add( left );
            JPanel right = new JPanel( new BorderLayout() );
            right.add(new JLabel("right message " + i), BorderLayout.LINE_END);
            vertical.add( right );
        }
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new JScrollPane(new SSCCE()) );
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args) throws Exception
    {
        java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
    }
}