2015-11-14 2 views
1

У меня есть JFrame и JPanel внутри. Фон моей игры полностью черный, поскольку сущности над ним. Я просто хотел бы изменить фон на изображение с моего компьютера на «самый простой» способ, не изменяя многое.Как добавить фоновое изображение в JPanel?

public Game() { 
    // Frame 
    JFrame container = new JFrame("Space Invaders"); 

    // Resolution 
    JPanel panel = (JPanel) container.getContentPane(); 
    panel.setPreferredSize(new Dimension(800,600)); 
    panel.setLayout(null); 

    // Canvas Size 
    panel.setBounds(0,0,800,600); 
    panel.add(this); 

    // Window Visible 
    container.pack(); 
    container.setResizable(false); 
    container.setVisible(true); 

    container.addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e) { 
      System.exit(0); 
     } 
    }); 
} 
+0

Создайте 'JLabel', установите его макет на' BorderLayout', примените к нему изображение так же, как и любую другую метку, установите это как «contentpane» в кадре и продолжайте, как и было. Конечно, вы могли бы просто использовать «Graphics # drawImage», но так как я не знаю, как работает ваш код, трудно сделать рекомендацию о том, что является «простейшим». – MadProgrammer

+0

Попробуйте, что здесь предлагается, и http: // stackoverflow. ком/вопросы/19125707/Простейшим-полосная к СЭТ-изображения-в-JPanel-фон – coderrick

ответ

4

Вы могли бы ...

Используйте JLabel в качестве фонового компонента ...

JFrame container = new JFrame("Space Invaders"); 
JLabel label = new JLabel(new ImageIcon(ImageIO.read(...))); 
label.setLayout(new BorderLayout()); 
container.setContentPane(label); 

// Resolution 
// There are simply so many different ways to achieve this 
// that are better it's not funny 
//JPanel panel = (JPanel) container.getContentPane(); 
//panel.setPreferredSize(new Dimension(800, 600)); 
//panel.setLayout(null); 

// Canvas Size 
//setBounds(0, 0, 800, 600); 
//panel.add(this); 

// Window Visible 
container.pack(); 
container.setResizable(false); 
container.setVisible(true); 

container.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
// Pointless 
//container.addWindowListener(new WindowAdapter() { 
// public void windowClosing(WindowEvent e) { 
//   System.exit(0); 
//  } 
//}); 

Проблема с этим:

  1. Ярлык будет использовать только icon и text недвижимость для расчета preferredSize с меткой
  2. Если вы используете java.awt.Canvas, тогда он будет рисовать этот компонент, так как java.awt.Canvas не может быть прозрачным.

См Reading/Loading an Image и How to Use Labels для более подробной информации

Вы могли бы ...

Использование Graphics#drawImage сделать фоновое изображение, прежде чем рендерер сброс содержимого.

Это будет, как правило, лучшее решение, поскольку Вы получаете полный контроль над размером и положением изображения и будет работать, если вы используете java.awt.Canvas и BufferStrategy

См 2D Graphics и Working with Images для получения более подробной информации

Смежные вопросы