2014-04-27 3 views
1

Расположение коробок представляется вполне подходящим для потребностей типичного макета чата, такого как тот, который я сделал в InkScape.
enter image description hereРазметка чата с менеджером BoxLayout

Я на основе структуры, как это:

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

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

enter image description here

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

enter image description here

Итак:

  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); 
    } 
} 

А вот messageList:

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. – trashgod

+0

Спасибо, что предупредил меня, однако теперь, когда я знаю, что не делать, мне любопытно, что мне делать вместо этого. Есть ли текстовое поле качания? –

+0

Да, есть. «JTextField» – AloneInTheDark

ответ

1

Как показано в How to Use BoxLayout: Specifying Component Sizes, вы можете override в getXxxSize() методы в выбранном JTextComponent подкласса.

+1

Кроме того, у большинства элементов есть '.setXxxSize', который равен переопределению метода (но может, конечно, установить только значение constant, а переопределение метода может позволить более сложное поведение). –

+0

По нескольким причинам вы можете предпочесть [переопределить] (http://stackoverflow.com/q/7229226/230513). – trashgod

+0

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