我试图在JFrame
中创建一个相对较小规模的基于文本的游戏。我打算保持这个JFrame
在一个恒定的大小,所以我打电话setResizable(false)
。JFrame中盒装JScrollPanes之间的额外空间
我的目标是使该有所表现得像一个控制台或命令提示符下一个文本I/O功能,所以我有一个JScollPane
内的两个JTextArea
S,各自,然后我他们俩加入Box
,一个在另一个之上。我希望这些组件保持恒定的尺寸,所以我使用适当的尺寸调用了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();
}
}
1)空格似乎来自'Box'而不是'FlowLayout'。2)提供ASCII艺术或简单的GUI图形布局。 –
@AndrewThompson谢谢你的提示!正如你所建议的那样,我用一张我想让GUI看起来像的图片来修改这篇文章。基本上,我只是想消除差距。你有什么想法,盒子可能会导致它出现?我很困惑 - JButtons也在盒子里,但没有显示任何差距。 – kattusite
我可能会使用四个面板。 1)用于文本区域的2x2'GridLayout'。 2)按钮的2x2'GridLayout'。 3)用于居中包含按钮的面板的'GridBagLayout'。 4)用于文本区域面板('LINE_START')的'BorderLayout',以及使用'GridBagLayout'('LINE_END')的面板。 - 不要混淆首选。最小或最大尺寸的任何东西。将“EmptyBorder”添加到具有边框布局的面板,然后在显示帧之前打包该帧。 –