Попытка создать несколько 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 вправо или используйте другой макет.
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);