JPanel забывает свою позицию

#java #swing #jpanel

#java #swing #jpanel

Вопрос:

У меня есть JPanel, которая должна быть расположена. Я пытался использовать setBounds в конструкторе panels, но это не сработало. Кажется, что границы забываются, когда я вызываю paintComponent .

 public class Panel extends JPanel {

    public Panel() {

        setBounds(120,100,20,300);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        // Prints out (0,0)
        System.out.println("Location: "   getLocation());
        g.drawOval(0,0, 60, 60);
    }

}
  

Ответ №1:

В Swing позиционирование компонента редко определяется самим компонентом. Обычно это определяется LayoutManager контейнера (на который, в свою очередь, влияет менеджер компоновки его собственного контейнера).

Обоснование заключается в том, что визуальное позиционирование не является методом «разделяй и властвуй»: позиционирование одного компонента влияет на позиционирование других компонентов, поэтому вам нужен какой-то «центральный орган по позиционированию», ОН же: менеджер макета.

Ответ №2:

Чтобы использовать абсолютное позиционирование (я бы ничего не рекомендовал, за исключением очень редких случаев), вы должны удалить родительский менеджер компоновки, вызвав setLayout(null); родительский контейнер:

 getContentPane().setLayout(null);
getContentPane().add(new Panel());