2017-01-17 29 views
0

我试图在JFrame中创建一个相对较小规模的基于文本的游戏。我打算保持这个JFrame在一个恒定的大小,所以我打电话setResizable(false)JFrame中盒装JScrollPanes之间的额外空间

我的目标是使该有所表现得像一个控制台或命令提示符下一个文本I/O功能,所以我有一个JScollPane内的两个JTextArea S,各自,然后我他们俩加入Box,一个在另一个之上。我希望这些组件保持恒定的尺寸,所以我使用适当的尺寸调用了setPreferredSize()setMaximumSize()

但是,当我将这两个盒子添加到JFrame时,它们之间存在横向差距。差距似乎附在组件的右侧边框上。请参阅此行为的附图:

gaps)。

我在内容窗格中使用了FlowLayout,hGap设置为0,但是我添加的组件之间仍然存在间隙,我找不到原因。

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

如果可能的话我想删除差距,或至少确定是什么原因造成的。在这一点上,我不知道还有什么可能导致这个问题,我会很感激任何建议。

编辑:这里是希望这个演示类什么我看起来像一个画面:

no gaps

我已经摘录的代码中的相关位到这个类来说明我的问题:

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

1)空格似乎来自'Box'而不是'FlowLayout'。2)提供ASCII艺术或简单的GUI图形布局。 –

+0

@AndrewThompson谢谢你的提示!正如你所建议的那样,我用一张我想让GUI看起来像的图片来修改这篇文章。基本上,我只是想消除差距。你有什么想法,盒子可能会导致它出现?我很困惑 - JButtons也在盒子里,但没有显示任何差距。 – kattusite

+1

我可能会使用四个面板。 1)用于文本区域的2x2'GridLayout'。 2)按钮的2x2'GridLayout'。 3)用于居中包含按钮的面板的'GridBagLayout'。 4)用于文本区域面板('LINE_START')的'BorderLayout',以及使用'GridBagLayout'('LINE_END')的面板。 - 不要混淆首选。最小或最大尺寸的任何东西。将“EmptyBorder”添加到具有边框布局的面板,然后在显示帧之前打包该帧。 –

回答

0

我想清楚是什么导致了间隙的出现,尽管我不太熟悉Swing或LayoutManagers准确地说出原因。

通过去除对内部组件的setMaximumSize()的调用,该程序以我喜欢的方式工作。我的猜测是,当被要求使用绝对最大尺寸时,其中一个版面管理器(可能是嵌入BoxBoxLayout?)的行为与我预期的不同,而不是依赖于首选尺寸,并让布局管理器执行工作。

下面是修订后的代码,将有问题的行注释掉了。

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; 
} 

虽然这种解决方案做什么,我想它,它可能是不理想的,因为安德鲁·汤普森在他的评论中提到的,我要尽量避免设置任何优选/最大尺寸。