Java 与BoxLayout manager聊天布局

Java 与BoxLayout manager聊天布局,java,swing,boxlayout,Java,Swing,Boxlayout,框布局似乎非常适合我在InkScape中制作的典型聊天布局的需要。 我的结构基础如下: MainFrame Chat JPanel - BoxLayout.Y_AXIS Message list - ScrollablePanel the list - BoxLayout.Y_AXIS Text field - Just a text field 现在我唯一的问题是,在初始阶段,文本字段和消息列表之间的空间被划分为50%到50% 但是,如果消息区域已填充,

框布局似乎非常适合我在InkScape中制作的典型聊天布局的需要。

我的结构基础如下:

MainFrame
  Chat JPanel - BoxLayout.Y_AXIS
    Message list - ScrollablePanel
       the list - BoxLayout.Y_AXIS
    Text field - Just a text field
现在我唯一的问题是,在初始阶段,文本字段和消息列表之间的空间被划分为50%到50%

但是,如果消息区域已填充,如上图所示,并且我尝试调整聊天窗口的大小,则一切正常:

因此:

  • 我希望textarea保持相同的大小,即使消息容器是空的
  • 必须调用一个方法来模拟我调整窗口大小,以便面板正确更新
  • 以下是聊天面板:

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

    如中所示,您可以在所选子类中使用
    getXxxSize()
    方法。

    作为一般规则,不要将AWT组件(如
    java.AWT.TextField
    )与Swing组件混合使用。感谢您的警告,但是现在当我知道不应该做什么时,我很好奇应该做什么。有swing文本字段吗?是的,有。“JTextField”大多数swing组件名称以“J”字母开头。“JCombobox,JCalendar等。”我已经链接到下面的一个相关教程。此外,大多数元素都有
    。setXxxSize
    ,这等于重写方法(当然,只能将值设置为常量,而方法重写可以允许更复杂的行为).出于几个原因,你可能更愿意。我在谷歌搜索答案时已经读过了。我真的认为它也适用于覆盖。但是,如果您知道这两种方法之间的差异的一个很好的描述,那将是非常有用的。另一种方法是使用
    BorderLayout.SOUTH
    作为文本区域,并将滚动列表嵌套在
    CENTER
    中。