Какой менеджер раскладки я должен использовать - PullRequest
0 голосов
/ 21 марта 2020

Я делаю чат в java и мне нужно отобразить старые сообщения в JPanel. Мне нужно изображение и сообщение, которое было отправлено / получено для отображения, каждое в своей строке. Код, который у меня сейчас есть:

JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel container = new JPanel();
container.setPreferredSize(new Dimension(300, 400));

// Printing five messages
for (int i = 0; i < 5; i++) {
    JPanel p = new JPanel();
    p.setPreferredSize(new Dimension(300, 40));
    p.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));

    JLabel img = new JLabel("Image : ");
    JLabel txt = new JLabel("This is some text");

    p.add(img);
    p.add(txt);

    img.setAlignmentX(Component.LEFT_ALIGNMENT);
    txt.setAlignmentX(Component.LEFT_ALIGNMENT);

    container.add(p);
}

f.add(container);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true); 

Результат:
enter image description here

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

1 Ответ

3 голосов
/ 21 марта 2020

он должен автоматически изменить размер своего содержимого.

Основной проблемой здесь является перенос текста на новую строку.

Одним из способов может быть:

  1. использовать вертикальную рамку - она ​​позволяет каждому компоненту иметь разную высоту
  2. перенос текста в HTML - это позволяет тексту переносить

Что-то вроде:

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

public class Chat extends JPanel
{
    private Box messageBox = Box.createVerticalBox();

    public Chat()
    {
        setLayout( new BorderLayout() );
        add(messageBox, BorderLayout.PAGE_START);

        addMessage("Short message");
        addMessage("A longer message that should wrap as reqired onto another line. This should happen dynamically");
    }

    public void addMessage(String text)
    {
        JPanel messagePanel = new JPanel( new BorderLayout() );

        JLabel label = new JLabel( new ImageIcon("about16.gif") );
        messagePanel.add(label, BorderLayout.LINE_START);

        JLabel message = new JLabel("<html>" + text + "</html>");
        messagePanel.add(message);

        messageBox.add(messagePanel);
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Chat");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new Chat());
        frame.pack();
        frame.setSize(200, 100);
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

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