Панель содержимого JFrame по умолчанию использует BorderLayout, что означает, что add(game)
поместит компонент Game в центр BorderLayout.BorderLayout может иметь только один центральный компонент за раз, поэтому add(background)
заменяет старый центральный компонент (игру) на фоновый JLabel.
Простое решение состоит в том, чтобы не использовать JLabel для фона, и простозакрасьте фон в вашем методе рисования:
g2d.drawImage(img, 0, 0, this);
p1.paint(g2d);
p2.paint(g2d);
Для этого потребуется закрытое поле типа BufferedImage (или просто изображение) в вашем классе Game, которое вы можете установить в конструкторе этого класса.
Обратите внимание, что вы почти всегда должны переопределять paintComponent , а не рисовать:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// ...
}
Все подробности относительно рисования компонентов Swing см. https://www.oracle.com/technetwork/java/painting-140037.html.
Обновление : может показаться, что ваш background
JLabel определял размер содержимого JFrame при вызове метода JFrame pack()
.
Как только фоновый JLabel был удален, единственнымоставшийся компонент (экземпляр класса Game
) должен определить свой собственный предпочтительный размер, чтобы при вызове метода JFrame pack()
онзнать, какого размера должно быть содержимое JFrame.Вы можете сделать это, явно указав классу Game свой предпочтительный размер:
@Override
public Dimension getPreferredSize() {
return new Dimension(img.getWidth(), img.getHeight());
}
Для этого потребуется img
типа BufferedImage, поскольку методы getWidth и getHeight с нулевым аргументом не существуют вКласс изображения.