我正在尝试创建多个相同格式的JLabel,然后尝试将它们添加到同一个JPanel中。但是,只有一个JLabel出现,我无法弄清楚原因! 这是我写的代码:
final JPanel labelPanel = new JPanel(new BorderLayout());
panel.add(labelPanel, BorderLayout.NORTH);
JLabel[] dashedLineLabel = new JLabel[wordLength];
for (int i = 0; i < wordLength; i++)
{
dashedLineLabel[i] = new JLabel("__ ");
dashedLineLabel[i].setFont(new Font("Serif", Font.BOLD, 30));
labelPanel.add(dashedLineLabel[i]);
}
任何帮助将不胜感激! 谢谢
答案 0 :(得分:3)
您没有正确使用BorderLayout。标签全部添加在布局的中心位置,因此会相互覆盖。尝试使用FlowLayout,甚至更好的是MigLayout。
答案 1 :(得分:3)
您不能使用BorderLayout
,因为该布局只有5个组件的空间:
BorderLayout.CENTER
,BorderLayout.NORTH
,BorderLayout.WEST
,BorderLayout.SOUTH
,BorderLayout.EAST
。
内置布局之一的解决方案:
我建议使用FlowLayout
或GridLayout
,具体取决于您的需求。您仍然可以使用BorderLayout作为外部面板,但只需引入一个内部面板,其中包含上述布局之一。
因此,使用GridLayout
,您可以将标签包装在网格布局中,然后将其放在边框布局中。你的代码看起来像这样:
panel.setLayout(new BorderLayout());
final JPanel upperPanel = new JPanel();
panel.add(upperPanel, BorderLayout.NORTH); // add some stuff in the north
final JPanel innerPanel = new JPanel(new GridLayout(1,0));
JLabel[] dashedLineLabel = new JLabel[wordLength];
for (int i = 0; i < wordLength; i++) {
dashedLineLabel[i] = new JLabel("__ ");
dashedLineLabel[i].setFont(new Font("Serif", Font.BOLD, 30));
innerPanel.add(dashedLineLabel[i]);
}
panel.add(innerPanel, BorderLayout.CENTER);
使用MigLayout解决方案:
如果您不想在不同的布局之间进行选择,您还可以使用MigLayout,这是第三方布局管理器,它基本上为您提供了一个管理器中的所有选项。你会有更多更清洁的代码(imho)。缺点当然是您必须使用外部jar文件作为依赖项。 (顺便说一下:自从我发现了MigLayout之后,我再也没有使用过另一个布局管理器。)
使用MigLayout
:
final JPanel labelPanel = new JPanel(new MigLayout("", "", ""));
panel.add(labelPanel, "north");
JLabel[] dashedLineLabel = new JLabel[wordLength];
for (int i = 0; i < wordLength; i++) {
dashedLineLabel[i] = new JLabel("__ ");
dashedLineLabel[i].setFont(new Font("Serif", Font.BOLD, 30));
panel.add(dashedLineLabel[i], "wrap");
}
答案 2 :(得分:2)
BorderLayout规范说
here 中的边框布局布置一个容器,安排并调整其大小 适合五个地区的组成部分:北,南,东,西,和 中央。每个区域可能包含不超过一个组件,并且是 由相应的常数识别:NORTH,SOUTH,EAST,WEST和 中央。将组件添加到具有边框布局的容器时, 使用这五个常数中的一个,......
当您使用默认的add方法时,它会将组件添加到父级的中心,因此在您的情况下,您只会看到一个组件被添加。
您可以使用其他布局(即流程或其他布局)来满足您的需求。
答案 3 :(得分:1)
如果您使用BorderLayout
并使用简单add
方法添加组件,则会将它们全部添加到中心。如果中心没有其他容器,它们都是彼此重叠的,你可以看到顶部的容器。使用BorderLayout或使用其他布局。
来自documentation of BorderLayout:
A border layout lays out a container, arranging and resizing its components to fit in five regions: north, south, east, west, and center. Each region may contain no more than one component, and is identified by a corresponding constant: NORTH, SOUTH, EAST, WEST, and CENTER. When adding a component to a container with a border layout, use one of these five constants, for example:
Panel p = new Panel();
p.setLayout(new BorderLayout());
p.add(new Button("Okay"), BorderLayout.SOUTH);
As a convenience, BorderLayout interprets the absence of a string specification the same as the constant CENTER:
Panel p2 = new Panel();
p2.setLayout(new BorderLayout());
p2.add(new TextArea()); // Same as p.add(new TextArea(), BorderLayout.CENTER);