Макет сверху вниз в Java с динамическим изменением размера

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

Желаемый результат

Вы можете увидеть ожидаемый результат выше. Каждая пузырьковая строка - это панель JPanel. Все они выровнены по низу. Пузырькам должно быть разрешено расширяться вместе с текстовым содержимым до определенного МАКСИМАЛЬНОГО значения, затем следует переносить слова. Изображение пользователя всегда должно быть выровнено по верхнему краю, даже если пузырек становится многорядным. Однако отметка времени должна быть выровнена по центру пузыря.

Любая помощь будет оценена по достоинству. Я полагаю, мне следует использовать какой-нибудь другой диспетчер макетов, например MigLayout вместо BoxLayout?

ОБНОВЛЕНИЕ 1: похоже, это работает:

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.JPanel;

import javax.swing.BoxLayout;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Panel;

import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;


public class FormTest extends JFrame {

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

@SuppressWarnings("deprecation")
public FormTest() {

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("Test");
    this.setSize(1000, 500);
    this.setMinimumSize(new Dimension(700, 300));
    this.setLocationRelativeTo(null);

    //Bubble panel
    JPanel bubble = new JPanel();
    bubble.setBackground(Color.RED);
    bubble.setLayout(new BoxLayout(bubble, BoxLayout.X_AXIS));

    //Container panel
    JPanel container = new JPanel();
    container.setBackground(Color.CYAN);

    FormLayout layout = new FormLayout("fill:default:grow", "fill:default:grow");
    PanelBuilder builder = new PanelBuilder(layout);
    CellConstraints cc = new CellConstraints();

    layout.appendRow(new RowSpec("pref"));
    builder.add(bubble, cc.xy(1, layout.getRowCount()));        

    container.setLayout(layout);

    //Add container panel to window
    getContentPane().add(builder.getPanel(), BorderLayout.CENTER);

    JLabel lblAaaa = new JLabel("<html>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</html>");
    bubble.add(lblAaaa);

    //Create the window
    this.setVisible(true);
}

}

person Daniele Testa    schedule 12.03.2014    source источник


Ответы (1)


если вы используете Swing, вы можете попробовать использовать для этого макет формы из jgoodies. Посмотрите здесь: http://www.jgoodies.com/freeware/libraries/forms/ < / а>

Сначала определите прокладку ("fill: default: grow"), а затем динамически добавьте панели внизу

Вы можете определить свой макет следующим образом:

FormLayout layout = new FormLayout("file:default:grow","fill:default:grow");
PanelBuilder builder = new PanelBuilder(layout);
CellConstraints cc = new CellConstraints();

layout.appendRow(new RowSpec("pref"));
buiulder.add(new Panel(), cc.xy(1,layout.getRowCount()));

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

person NeoP5    schedule 12.03.2014
comment
Извините, я не совсем понимаю. Я опубликовал обновление с тем, что у меня есть на данный момент. - person Daniele Testa; 12.03.2014
comment
Привет, да, выглядит неплохо. The 'container.setLayout (layout);' вам не нужно, поскольку строитель уже делает это за вас внутри. Теперь поместите панель контейнера в панель JScrollbar, и все должно быть в порядке. - person NeoP5; 12.03.2014
comment
Подсказка: чтобы оставалось пространство между пузырем, просто добавьте новую пустую строку в макет перед вставкой новой строки (для пузыря) и самого пузыря: layout.appendRow (new RowSpec (25px)); layout.appendRow (новый RowSpec (преф)); builder.add (my2ndBubblePanel, cc.xy (1, layout.getRowCount ())); - person NeoP5; 12.03.2014
comment
Подсказка 2: вы также можете делать напрямую: новый PanelBuilder (макет, контейнер); и удалите getContentPane (). add (builder.getPanel (), BorderLayout.CENTER); - person NeoP5; 12.03.2014