Сдвиг JLabel внутри Frame

Пытаюсь создать небольшой платформер, пока что сделал только отрисовку изображений с будущими объектами, но JLabel с картинкой отображаются не на своём месте, а в getComponent() присутствует надпись invalid. Класс со сбором объектов пока не скину, но, судя по консоли, данные передаются верно, и, по идее, квадратики тоже должны стоять на местах. НО:

  • Объекты не своего размера (100x100 вместо 1000х100 например)
  • Объекты не стоят на своих местах (если сравнивать по результату на картинке)

Добавил ещё один квадратик, вне метода drawMap(), с ним всё в порядке...

Почему так получается? Помогите, пожалуйста.

Класс окна:

import javax.swing.*;
import java.awt.*;

class Window extends JFrame {

    JPanel mainPanel;
    private int w = 1500;
    private int h = 800;

    Window() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setLayout(null);
        setLocation((screenSize.width - w) / 2, (screenSize.height - h) / 2);
        setSize(w + 16, h + 39);
        setResizable(false);
        setVisible(true);
        getContentPane().setLayout(null);

        JLabel label = new JLabel(new ImageIcon("default.png"));
        label.setSize(100, 100);
        label.setLocation(0, 700);
        label.setVisible(true);
        label.setBackground(Color.BLACK);
        getContentPane().add(label);
    }

    void drawMap(GameMap map) {
        for (GameObject obj : map.getObjects()) {
            JLabel label = new JLabel(new ImageIcon(obj.texture));
            label.setSize(obj.width, obj.height);
            label.setLocation(obj.x, h - obj.y - obj.height);
            label.setVisible(true);
            label.setBackground(Color.BLACK);
            getContentPane().add(label);
            System.out.println(obj.x + "/" +  label.getX() + ", " + obj.y + "/" +  label.getY() + ", " + obj.width + "/" +  label.getWidth() + ", " + obj.height + "/" +  label.getHeight());
        }
        System.out.println(getContentPane().getComponentCount());
        repaint();
        System.out.println(getContentPane().getComponent(0));
        System.out.println(getContentPane().getComponent(1));
        System.out.println(getContentPane().getComponent(2));
    }
}

Главный класс:

public class Game {

    private static Window window;
    private static GameMap map;

    public static void main(String[] args) {
        window = new Window();
        map = new GameMap("start");
        window.drawMap(map);
    }
}

Вывод в консоль после этого всего:

0/0, 200/500, 100/100, 100/100
0/0, 0/700, 1000/1000, 100/100
200/200, 100/600, 200/200, 100/100
4
javax.swing.JLabel[,0,700,100x100,alignmentX=0.0,alignmentY=0.0,border=,flags=8388608,maximumSize=,minimumSize=,preferredSize=,defaultIcon=default.png,disabledIcon=,horizontalAlignment=CENTER,horizontalTextPosition=TRAILING,iconTextGap=4,labelFor=,text=,verticalAlignment=CENTER,verticalTextPosition=CENTER]
javax.swing.JLabel[,0,500,100x100,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=8388608,maximumSize=,minimumSize=,preferredSize=,defaultIcon=default.png,disabledIcon=,horizontalAlignment=CENTER,horizontalTextPosition=TRAILING,iconTextGap=4,labelFor=,text=,verticalAlignment=CENTER,verticalTextPosition=CENTER]
javax.swing.JLabel[,0,700,1000x100,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=8388608,maximumSize=,minimumSize=,preferredSize=,defaultIcon=default.png,disabledIcon=,horizontalAlignment=CENTER,horizontalTextPosition=TRAILING,iconTextGap=4,labelFor=,text=,verticalAlignment=CENTER,verticalTextPosition=CENTER]

Результат: введите сюда описание изображения


Ответы (0 шт):