【问题标题】:GridBagLayout doesn't fill all the spaceGridBagLayout 没有填满所有空间
【发布时间】:2014-04-13 19:56:40
【问题描述】:

我有一个面板,用作卡片布局的一部分。面板使用GridBagLayout。我添加了两个组件:JTextArea 填充设置为 BOTH 和 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);

目前看起来是这样的

【问题讨论】:

  • 您的预期输出是什么?请分享。
  • 好吧,我以为 JTextArea 会占用所有空间,而 TextField 只是底部的一个小条(大小还可以)

标签: java swing layout-manager gridbaglayout


【解决方案1】:

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

快照:

【讨论】:

  • 我做到了。有趣的是,您的代码并不完全符合我的需要。还有一些未使用的区域。我将 JTextArea weighty 设置为 1,将 JTextFields 设置为 0。现在似乎没问题。
  • 是的,您可以更改它。我只是给你一个提示。对于聪明的人来说,提示就足够了。 :)
  • 我以前做过。但我认为这可能是导致问题的原因。我会重新添加它:)
  • 恭喜,你得到了我今天的最后一票,因为我现在已经用完了。
  • 我的荣幸。晚安,非常感谢。我正在向你们学习。
【解决方案2】:

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

【讨论】:

  • 你实际上可能是对的......我今天对使用 GridBagLayout 太着迷了,以至于我忘记了更基本的那个
  • @Bebras:但同样,braj 正确回答了您的实际问题。 1+ 他的回答。