JFrame 中的盒装 JScrollPanes 之间的额外 space

Extra space between boxed JScrollPanes in a JFrame

我正在尝试在 JFrame 中创建一个规模相对较小的基于文本的游戏。我计划将此 JFrame 保持在恒定大小,因此我调用了 setResizable(false).

我的目标是制作一个有点像控制台或命令提示符的文本 I/O 功能,所以我有两个 JTextArea,每个都在 JScollPane 中,然后我已将它们都添加到 Box,一个在另一个之上。我希望这些组件保持不变的大小,所以我用适当的尺寸调用了 setPreferredSize()setMaximumSize()

但是,当我将其中两个 Box 添加到 JFrame 时,它们之间有一个水平间隙。间隙似乎连接到组件的右侧边框。此行为见附图:

).

我在内容窗格中使用 FlowLayout,hGap 设置为 0,但我添加的组件之间仍然存在间隙,我无法弄清楚原因。

为了确认 JFrame 本身或其布局管理器没有问题,我还添加了两个包含按钮的框,以说明它们之间没有间隙。

如果可能的话,我想消除差距,或者至少确定造成差距的原因。在这一点上,我不知道还有什么可能导致这个问题,我将不胜感激任何建议。

编辑:这是我希望这个演示 class 看起来像的图片:

我已将相关代码片段摘录到此 class 中以演示我的问题:

import javax.swing.*;
import java.awt.*;

public class Demo extends JFrame {
    public Demo() {
        super("Demo");
        setSize(400, 400);
        setResizable(false);

        int Y_AXIS = BoxLayout.Y_AXIS;

        getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
        getContentPane().setBackground(Color.RED);

        Box boxA = new Box(Y_AXIS);
        boxA.add(createComponent("output"));
        boxA.add(createComponent("input"));
        this.add(boxA);

        Box boxB = new Box(Y_AXIS);
        boxB.add(createComponent("output"));
        boxB.add(createComponent("input"));
        this.add(boxB);

        Box boxC = new Box(Y_AXIS);
        boxC.add(new JButton("Button"));
        boxC.add(new JButton("Button"));
        this.add(boxC);

        Box boxD = new Box(Y_AXIS);
        boxD.add(new JButton("Button"));
        boxD.add(new JButton("Button"));
        this.add(boxD);

        this.setVisible(true);
    }

    private JScrollPane createComponent(String initial) {
        JTextArea ta = new JTextArea(3, 10);
        ta.setText(initial);
        JScrollPane sp = new JScrollPane(ta);

        Dimension pref = new Dimension(100, 100);
        sp.setPreferredSize(pref);
        sp.setMaximumSize(pref);

        sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
        sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

        return sp;
    }

    public static void main(String[] args) {
        Demo d = new Demo();
    }

}

我弄清楚是什么导致出现间隙,尽管我对 Swing 或 LayoutManagers 不够熟悉,无法准确说明原因。

通过仅删除对内部组件的 setMaximumSize() 的调用,程序可以按照我希望的方式运行。我的猜测是其中一个布局管理器(可能是 Box 中内置的 BoxLayout?)在被要求使用绝对最大尺寸而不是依赖于首选大小并让布局管理器完成工作。

这是修改后的代码,有问题的行被注释掉了。

private JScrollPane createComponent(String initial) {
    JTextArea ta = new JTextArea(3, 10);
    ta.setText(initial);
    JScrollPane sp = new JScrollPane(ta);

    Dimension pref = new Dimension(100, 100);
    sp.setPreferredSize(pref);
    //sp.setMaximumSize(pref);

    sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
    sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

    return sp;
}

虽然这个解决方案可以满足我的要求,但它可能并不理想,正如 Andrew Thompson 在他的评论中提到的那样,我应该尽量避免设置任何 preferred/maximum 大小。