Макет чата с менеджером BoxLayout

1

Конструкция коробки кажется вполне подходящей для потребностей типичного макета чата, такого как тот, который я сделал в InkScape.
Изображение 174551

Я создал структуру следующим образом:

MainFrame
  Chat JPanel - BoxLayout.Y_AXIS
    Message list - ScrollablePanel
       the list - BoxLayout.Y_AXIS
    Text field - Just a text field

Теперь единственной проблемой, которая, как мне кажется, является то, что в начальной фазе пространство делится на 50-50% между текстовым полем и списком сообщений.

Изображение 174551

Однако, если область сообщений заполнена, как вы можете видеть на изображении выше, и я пытаюсь изменить размер окна чата, все идет хорошо:

Изображение 174551

Так:

  1. Я хочу, чтобы текстовая область сохраняла тот же размер, даже когда контейнер сообщений пуст.
  2. Должен быть метод, который будет вызываться для имитации изменения размера окна, чтобы панели обновлялись должным образом.

Вот панель чата:

public class ChatPanel extends JPanel {
    private BoxLayout layout;
    private TextField input;
    private MessageList messages;
    public ChatPanel() {
      layout = new BoxLayout(this, BoxLayout.Y_AXIS);
      setLayout(layout);
      //Create message list
      messages = new MessageList();
      messages.appendTo(this);
      //Create text field
      input = new TextField();
      add(input);
    }
    public void addMessage(String message) {
      messages.addMessage(message);   
    }
    public void appendTo(JFrame frame) {
       frame.getContentPane().add(this);   
    }
}

И вот список сообщений:

public class MessageList extends JPanel {
    public MessageList() {
      setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

    }
    public void addMessage(String message) {
      JLabel lb = new JLabel();
      lb.setText(message);
      add(lb);        
      validate();
    }
    public void appendTo(JPanel frame) {
       frame.add(new JScrollPane(this));   
    }
}
  • 1
    Как правило, не смешивайте компоненты AWT, такие как java.awt.TextField , с компонентами Swing.
  • 0
    Спасибо, что предупредили меня, однако теперь, когда я знаю, что не нужно делать, мне интересно, что мне делать вместо этого. Есть ли текстовое поле свинга?
Показать ещё 3 комментария
Теги:
swing
boxlayout

1 ответ

1
Лучший ответ

Как показано в getXxxSize() Использование BoxLayout: указание размеров компонентов", вы можете переопределить методы getXxxSize() в выбранном подклассе JTextComponent.

  • 1
    Кроме того, большинство элементов имеют .setXxxSize который равен переопределению метода (но, конечно, может только устанавливать значение на константу, в то время как переопределение метода может допускать более сложное поведение).
  • 0
    По нескольким причинам вы можете предпочесть переопределить .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню