Java JFrame中盒装JScrollPanes之间的额外空间

Java JFrame中盒装JScrollPanes之间的额外空间,java,swing,jframe,jscrollpane,boxlayout,Java,Swing,Jframe,Jscrollpane,Boxlayout,我试图在JFrame中创建一个相对较小的基于文本的游戏。我计划将这个JFrame的大小保持不变,所以我调用了setresizeable(false) 我的目标是创建一个文本I/O功能,它有点像控制台或命令提示符,因此我有两个JTextAreas,每个都在JScollPane中,然后我将它们都添加到一个框中,一个在另一个上。我希望这些组件保持一个恒定的大小,因此我使用适当的尺寸调用了setPreferredSize()和setMaximumSize() 但是,当我将其中两个框添加到JFrame时,

我试图在
JFrame
中创建一个相对较小的基于文本的游戏。我计划将这个
JFrame
的大小保持不变,所以我调用了
setresizeable(false)

我的目标是创建一个文本I/O功能,它有点像控制台或命令提示符,因此我有两个
JTextArea
s,每个都在
JScollPane
中,然后我将它们都添加到一个
框中,一个在另一个上。我希望这些组件保持一个恒定的大小,因此我使用适当的尺寸调用了
setPreferredSize()
setMaximumSize()

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

)

我在内容窗格中使用的是
FlowLayout
,hGap设置为0,但我添加的组件之间仍然存在差距,我无法找出原因

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

如果可能的话,我想消除这些差距,或者至少确定是什么造成了这些差距。在这一点上,我不知道还有什么可能导致这个问题,我希望得到任何建议

编辑:下面是我希望这个演示类的图片:

我已将相关代码片段摘录到本课程中,以演示我的问题:

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或LayoutManager不太熟悉,无法确切说明原因,但我还是找到了导致出现这些差距的原因

只需删除对内部组件的
setMaximumSize()
的调用,程序就会按照我希望的方式工作。我的猜测是,其中一个布局管理器(可能是内置在
框中的
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在评论中提到的,它可能并不理想,我应该尽量避免设置任何首选/最大尺寸

1)空格似乎来自
,而不是
流程布局
。。2) 提供ASCII艺术或GUI预期布局的简单绘图。@AndrewThompson感谢您的提示!正如你所建议的,我用我希望GUI看起来像什么的图片修改了这篇文章。基本上,我只是想消除这个差距。你知道是什么原因导致它出现的吗?我很困惑——成对的JButton也在盒子里,但没有显示间隙。我可能会使用四个面板来实现这一点。1) 文本区域的2x2
GridLayout
。2) 按钮的2x2
GridLayout
。3) 用于使包含按钮的面板居中的
GridBagLayout
。4) 文本区域面板(
LINE\u START
)的
BorderLayout
),以及使用
gridbagloayout
LINE\u END
)的面板不要和你喜欢的人乱搞。任何东西的最小或最大尺寸。将
EmptyBorder
添加到具有边框布局的面板中,然后在显示框架之前打包框架。感谢您的帮助!我对Swing库还是很陌生,所以我对其中的许多类都不熟悉,但我肯定会在Java文档中进一步研究它们。与此同时,我找出了导致出现差距的原因——这是最大尺寸的要求。尽管如此,我的代码仍然设置了首选大小,所以我将尝试进一步细化它。