繁体   English   中英

GridBagLayout 没有填满所有空间

[英]GridBagLayout doesn't fill all the space

我有一个面板,用作卡片布局的一部分。 该面板使用GridBagLayout 我向其中添加了两个组件:填充设置为 BOTH 的JTextArea和填充设置为水平的JTextField 它们只占用水平空间。

        // Chat card setup
        JPanel chatCard = new JPanel(new GridBagLayout());
        gc = new GridBagConstraints();

        gc.gridx = 0;
        gc.gridy = 0;
        gc.fill = GridBagConstraints.BOTH;
        gc.weightx = 2;
        chatArea = new JTextArea();
        chatCard.add(chatArea,gc);

        gc.gridx = 0;
        gc.gridy = 1;
        gc.fill = GridBagConstraints.HORIZONTAL;
        gc.anchor = GridBagConstraints.PAGE_END;
        gc.weightx = 2;
        JTextField msgField = new JTextField();
        msgField.setActionCommand("SendText");
        msgField.addActionListener(listener);
        chatCard.add(msgField, gc);

目前看起来像这样

带有 GridBagLayout 的面板

尝试使用gc.weighty

     ...
    gc.weightx = 2;
    gc.weighty=1;
    chatArea = new JTextArea();

    ...
    JScrollPane scrollPane=new JScrollPane(chatArea);
    chatCard.add(scrollPane,gc);
    ...

    ...
    gc.weightx = 2;
    gc.weighty=0;
    JTextField msgField = new JTextField();
    ...

JScrollPane添加JTextArea否则当行大于其高度时您会得到意想不到的结果。

使用gc.insets=new Insets(5, 5, 5, 5); 如果你想从顶部/左侧/底部/右侧留出一些空间。

快照:

在此处输入图片说明

@Braj 有 GridBagLayout 的答案——使用重量约束,他的答案是 1+,但我认为如果你使用 BorderLayout,将你的 JTextArea 放在 JScrollPane 中,放置 JScrollPane BorderLayout,你的设置会更好。 CENTER 和 JTextField BorderLayout.SOUTH(也称为 BorderLayout.PAGE_END)。

  JPanel chatCard = new JPanel(new BorderLayout(5, 5));
  int rows = 20;
  int cols = 40;
  JTextArea chatArea = new JTextArea(rows, cols);
  chatCard.add(new JScrollPane(chatArea), BorderLayout.CENTER);

  JTextField msgField = new JTextField(cols);
  msgField.setActionCommand("SendText");
  // msgField.addActionListener(listener);
  chatCard.add(msgField, BorderLayout.PAGE_END);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM