JFrame JLabel没有完全显示

时间:2014-04-20 21:55:22

标签: java swing jpanel jlabel layout-manager

第一次使用Java swing,我不知道我哪里出错了。 我正在创建一个JFrame,然后创建两个JPanels来添加它。每个JPanel都添加了一些JLabelsJFrameJPanels被指定为FlowLayouts,根据我的理解,它意味着事物只会按照添加顺序显示,如果没有,则会添加到下一行在当前行上为他们提供空间。

这是我的问题:如果我运行当前代码并只添加我的第一个面板(infoPanel),我会得到一个如下所示的正确结果:this

但是,如果我尝试添加两个面板,第一个被覆盖并且第一个面板的JLabels没有完全显示(每个应该有更多的“Na ...”,这是只有以“名称”开头的多行字符串的第一部分。我指定最小尺寸为100x100,但它们仍然只有几个字符。我已经尝试将它们制作成400x400和其他尺寸,但没有任何变化。看起来像这样:

我的问题是: (1)我是否错误地对待我的面板?带有JFrame的{​​{1}}是否无法在不覆盖已添加的第一个面板的情况下添加两个面板? (2)为什么我的FlowLayout显示不完整?我不明白我哪里出错了,因为它们与我JLabels JLabels中的infoPanel指定的完全相同,而且看起来并不相同......

感谢任何帮助,我的代码如下:

JPanel

3 个答案:

答案 0 :(得分:3)

  

带有FlowLayout的JFrame是否无法在不覆盖添加的第一个面板的情况下添加两个面板?

是的,但问题是JFrame使用BorderLayout(不是FlowLayout)作为默认布局管理器。如果您没有指定约束,则组件会添加到CENTER,但您只能在CENTER中显示一个组件,因此只显示最后一个组件。因此,如果要将两个面板添加到框架中,则应使用以下内容:

content.add(infoPanel, BorderLayout.CENTER);
content.add(playerPanel, BorderLayout.SOUTH);
  

FlowLayouts(据我理解)意味着事情只是按照添加的顺序显示,如果当前行没有空间,则会添加到下一行。

基本上是正确的,但对于FlowLayout,首选大小计算为单行组件。 "包裹"只有面板有额外空间时才能看到组件。为了演示此更改,请使用上面的代码:

//content.add(infoPanel, BorderLayout.CENTER);
content.add(infoPanel, BorderLayout.NORTH);

您将看不到包装的组件。有关此问题的详细信息和解决方案,请参阅Wrap Layout

答案 1 :(得分:0)

您似乎正在尝试使用FlowLayout.CENTER添加2个JPanel,以便它们相互覆盖。

如果我理解正确, 您应该添加另一个面板,如:

JPanel mainPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
mainPanel.add(infoPanel);
mainPanel.add(playerPanel);

content.add(mainPanel);

希望我能正确理解你的问题。

答案 2 :(得分:0)

问题是您将两个面板添加到同一个位置:默认JFrame的布局为BorderLayout,而BorderLayout的{​​{1}}默认为add(panel)

因此,要么明确指定位置,请说:

add(panel, BorderLayout.CENTER)

或者在框架中使用不同的布局:

content.add(infoPanel, BorderLayout.CENTER);
content.add(playerPanel, BorderLayout.SOUTH);

还有你

  • 应在添加所有组件之后使框架可见
  • 您可能想要添加frame.setLayout(new FlowLayout());

但是,我强烈建议使用视觉gui设计师,例如netbeans中的设计师。 (除非你需要动态构建gui)