public class MyFrame extends JFrame
{
public MyFrame(String title)
{
setSize(200, 200);
setTitle(Integer.toString(super.getSize().width));
setLayout(new FlowLayout());
for (int i = 0; i < 5; ++i)
{
JButton b = new JButton();
b.setSize(90,50);
b.setText(Integer.toString(b.getSize().width));
this.add(b);![alt text][1]
}
this.setVisible(true);
}
}
Почему при ширине кнопки 90 я получаю окно, в котором три кнопки в одном ряду вместо двух?
2 ответа
FlowLayout
разместит Component
слева направо (или справа налево), обернув их, если необходимо. Если вы хотите явно установить размер каждого JButton
, вам следует использовать setPreferredSize , а не setSize
, поскольку менеджеры по компоновке обычно используют минимальный, предпочтительный и максимальный размеры при выполнении макет.
Свойства размера довольно сбивают с толку - есть интересная статья здесь. В частности, обратите внимание:
Всегда ли соблюдаются свойства размера?
Некоторые менеджеры по расположению, такие как GridLayout, полностью игнорировать размер свойства .
FlowLayout пытается учитывать оба измерения предпочитаемого размера и, возможно, не имеет необходимости соблюдать минимальный размер или максимальный размер.
Во-первых, вы неправильно используете JFrame
: вы не добавляете компоненты непосредственно в фрейм, вы добавляете их в JPanel
, который затем передаете во фрейм с помощью setContentPane()
.
Также: не очень элегантно напрямую создавать подклассы JFrame
только для добавления компонентов. Вместо этого создайте рамку как отдельный объект.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].