尝试创建多个JLabel,但只有一个出现

时间:2012-10-31 13:34:10

标签: java swing layout jlabel border-layout

我正在尝试创建多个相同格式的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]);
    }   

任何帮助将不胜感激! 谢谢

4 个答案:

答案 0 :(得分:3)

您没有正确使用BorderLayout。标签全部添加在布局的中心位置,因此会相互覆盖。尝试使用FlowLayout,甚至更好的是MigLayout

答案 1 :(得分:3)

您不能使用BorderLayout,因为该布局只有5个组件的空间: BorderLayout.CENTERBorderLayout.NORTHBorderLayout.WESTBorderLayout.SOUTHBorderLayout.EAST

内置布局之一的解决方案:

我建议使用FlowLayoutGridLayout,具体取决于您的需求。您仍然可以使用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规范说

  

边框布局布置一个容器,安排并调整其大小   适合五个地区的组成部分:北,南,东,西,和   中央。每个区域可能包含不超过一个组件,并且是   由相应的常数识别:NORTH,SOUTH,EAST,WEST和   中央。将组件添加到具有边框布局的容器时,   使用这五个常数中的一个,......

here

中的

当您使用默认的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);