почему я должен устанавливать местоположение на каждом перекрашивании.
Вы не делаете. На самом деле, вы никогда не должны устанавливать позицию или какие-либо ограничения компонента внутри метода paintComponent
. paintComponent
метод предназначен только для рисования, но не для ориентации или чего-либо еще.
Когда положение jpanel.add(myComponent, constraints)
компонента будет определяться текущим контейнером LayoutManager . (Когда вы jpanel.add(myComponent);
без каких-либо ограничений, будут иметь место ограничения по умолчанию, при этом у каждого менеджера макета будет свой собственный стандарт).
Метка размещается в верхней части панели, поскольку вы не задаете макетпанели, поэтому она имеет значение по умолчанию, FlowLayout. . Чтобы изменить его, вам нужно будет использовать другой менеджер компоновки с соответствующими ограничениями.
Например, чтобыпоместите его в центр панели, вы должны сделать:
jpanel.setLayout(new BorderLayout());
jpanel.add(myLabel,BorderLayout.CENTER);
Наконец, сделав while(true)
внутри потока, в котором работает ваш графический интерфейс, он повесит поток, это означает, что графический интерфейс будет «заморожен». "поскольку события не могут иметь место.