Попытка создать несколько JLabels, однако появляется только один

Я пытаюсь создать несколько JLabel одинаковой формы, а затем пытаюсь добавить их в одну и ту же JPanel. Однако появляется только один из JLabels, и я не могу понять, почему! Вот код, который я написал:

    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 ответа

Решение

Вы не используете BorderLayout должным образом. Все метки добавляются в центре расположения макета и, таким образом, перезаписывают друг друга. Вместо этого попробуйте FlowLayout или, что еще лучше, MigLayout.

Вы не можете использовать 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");
}

Спецификация BorderLayout говорит

Граница макета размещает контейнер, упорядочивая и изменяя размеры его компонентов в соответствии с пятью областями: север, юг, восток, запад и центр. Каждый регион может содержать не более одного компонента и идентифицируется соответствующей константой: СЕВЕР, ЮГ, ВОСТОК, ЗАПАД и ЦЕНТР. При добавлении компонента в контейнер с макетом границы, используйте одну из этих пяти констант,....

здесь

Поскольку вы используете метод add по умолчанию, он добавляет компоненты в центр родительского элемента, и, таким образом, в вашем случае вы видите добавление только одного компонента.

Вы можете использовать другой макет (например, поток или другой), чтобы удовлетворить ваши потребности.

Если вы используете BorderLayout и добавить компоненты с простым add Метод они все добавляются в центре. Если в центре нет другого контейнера, все они находятся друг над другом, и вы можете просто увидеть верхний контейнер. Используйте BorderLayout вправо или используйте другой макет.

Из документации 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);
Другие вопросы по тегам