【问题标题】:Extra space between boxed JScrollPanes in a JFrameJFrame 中盒装 JScrollPanes 之间的额外空间
【发布时间】:2017-01-17 06:33:14
【问题描述】:

我正在尝试在JFrame 中创建一个相对较小的基于文本的游戏。我打算保持这个JFrame 的大小不变,所以我调用了setResizable(false)。

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

但是,当我将其中两个 Box 添加到 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();
    }

}

【问题讨论】:

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

标签: java swing jframe jscrollpane boxlayout


【解决方案1】:

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

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

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

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 在他的评论中提到的那样,我应该尽量避免设置任何首选/最大尺寸。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-05
    • 2020-05-28
    相关资源
    最近更新 更多