2014-04-27 158 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 

現在我似乎有唯一的問題是,在inital階段,空間被分成50%至50%和消息列表。

enter image description here

但是,如果消息區域被填滿,因爲你可以在上面的圖片中看到,我嘗試調整聊天窗口,一切順利的話:

enter image description here

所以:

  1. 我希望textarea保持相同的大小,即使當消息容器是空的。
  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); 
    } 
} 

這裏是給messageManager:

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

感謝您提醒我,但現在當我知道該怎麼辦時,我很好奇我應該怎麼做。有一個swing文本框? –

+0

是的,有。 「JTextField」 – AloneInTheDark

回答

1

How to Use BoxLayout: Specifying Component Sizes所示,可以override在您選擇的JTextComponent子類getXxxSize()方法。

+1

此外,大多數元素具有'.setXxxSize',它等於重寫該方法(但當然,只能將值設置爲常量,而方法覆蓋可以允許更復雜的行爲)。 –

+0

由於多種原因,您可能更願意[覆蓋](http://stackoverflow.com/q/7229226/230513)。 – trashgod

+0

我已經閱讀,當我谷歌搜索的答案。我真的認爲它也適用於重寫。但是如果你對這兩種方法之間的區別有了很好的描述,那就很有用。 –