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) 文本区域的2x2GridLayout
。2) 按钮的2x2GridLayout
。3) 用于使包含按钮的面板居中的GridBagLayout
。4) 文本区域面板(LINE\u START
)的BorderLayout
),以及使用gridbagloayout
(LINE\u END
)的面板不要和你喜欢的人乱搞。任何东西的最小或最大尺寸。将EmptyBorder
添加到具有边框布局的面板中,然后在显示框架之前打包框架。感谢您的帮助!我对Swing库还是很陌生,所以我对其中的许多类都不熟悉,但我肯定会在Java文档中进一步研究它们。与此同时,我找出了导致出现差距的原因——这是最大尺寸的要求。尽管如此,我的代码仍然设置了首选大小,所以我将尝试进一步细化它。