【发布时间】: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) 一个 2x2GridLayout用于按钮。 3)GridBagLayout用于使包含按钮的面板居中。 4) 文本区域面板 (LINE_START) 的BorderLayout和使用GridBagLayout的面板 (LINE_END)。 - 不要乱用首选。任何东西的最小或最大尺寸。将EmptyBorder添加到具有边框布局的面板中,然后在显示之前打包框架。 -
感谢您的帮助!我对 Swing 库还很陌生,所以我对其中的许多类并不熟悉,但我肯定会在 Java 文档中进一步研究它们。与此同时,我找出了导致差距出现的原因——这是最大尺寸调用。我的代码仍然设置了首选大小,所以我会尝试进一步完善它。
标签: java swing jframe jscrollpane boxlayout