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

我已经阅读,当我谷歌搜索的答案。我真的认为它也适用于重写。但是如果你对这两种方法之间的区别有了很好的描述,那就很有用。 –