第一次使用Java swing,我不知道我哪里出错了。
我正在创建一个JFrame
,然后创建两个JPanels
来添加它。每个JPanel
都添加了一些JLabels
。 JFrame
和JPanels
被指定为FlowLayouts
,根据我的理解,它意味着事物只会按照添加顺序显示,如果没有,则会添加到下一行在当前行上为他们提供空间。
这是我的问题:如果我运行当前代码并只添加我的第一个面板(infoPanel
),我会得到一个如下所示的正确结果:。
但是,如果我尝试添加两个面板,第一个被覆盖并且第一个面板的JLabels
没有完全显示(每个应该有更多的“Na ...”,这是只有以“名称”开头的多行字符串的第一部分。我指定最小尺寸为100x100,但它们仍然只有几个字符。我已经尝试将它们制作成400x400和其他尺寸,但没有任何变化。看起来像这样:
我的问题是:
(1)我是否错误地对待我的面板?带有JFrame
的{{1}}是否无法在不覆盖已添加的第一个面板的情况下添加两个面板?
(2)为什么我的FlowLayout
显示不完整?我不明白我哪里出错了,因为它们与我JLabels
JLabels
中的infoPanel
指定的完全相同,而且看起来并不相同......
感谢任何帮助,我的代码如下:
JPanel
答案 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)