Сдвиг 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]
