Почему BoxLayout занимает лишнее пространство? - PullRequest
0 голосов
/ 12 июля 2020

Я работаю над приложением для общения клиент-сервер, в котором я пытаюсь создать речевой пузырь, как в WhatsApp

Я хочу отображать отправленные сообщения в правой части фрейма и полученные сообщения на в левой части кадра, я пытаюсь добиться этого, используя BoxLayout, но он занимает дополнительное место (как на картинке ниже) введите описание изображения здесь

Это то, что я делал до сих пор

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

Дополнительное пространство, которое вы видите между двумя сообщениями, связано с BoxLayout, которое я использую Что делать в этом случае? и любые альтернативы, как мы можем достичь этого, не используя BoxLayout?

1 Ответ

2 голосов
/ 13 июля 2020

Таким образом, FlowLayout соблюдает предпочтительную высоту, но также соблюдает предпочтительную ширину.

Вместо этого вам нужен макет, который:

  1. будет учитывать высоту добавляемого вами компонента в BoxLayout
  2. заполняет ширину доступного пространства.

Для этого вы можете использовать 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() );
    }
}
...