2016-02-14 3 views
1

Я знаю, что этот вопрос задан раньше, но я не могу реализовать какие-либо другие ответы на мой проект. Поэтому у меня есть мой метод рисования в моем классе игроков.Добавление jpanel на фоне jlabel

public void paintComponent(Graphics g) 
{ 
    //makes player(placeholder for real art) 
    super.paintComponent(g); 
    g.setColor(Color.GREEN); 
    g.fillRect(x,y,50,30); 
} 

Тогда у меня есть мой основной класс.

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
/** 
* Write a description of class Main here. 
* 
* @author Richard Zins 
* @V01 
*/ 
public class Main extends JFrame 
{ 
    public static void main(String[]args) 
    { 
    Player p1 = new Player(); 
    Main m = new Main(p1); 


    } 

    public Main(Player p1) 
    { 
     JFrame ar = new JFrame(); 
     JLabel background = new JLabel(new ImageIcon("/Users/rizins/Desktop/PacManTestBackGround.jpg")); 
     ar.setTitle("Runner Maze"); 
     ar.setSize(800,600); 
     ar.add(background); 
     ar.setVisible(true); 
     ar.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     ar.add(p1); 
    } 
} 

Теперь я не могу заставить объект моего игрока рисовать поверх моего фона, любая помощь будет оценена!

ответ

2

Есть несколько ошибок ...

  1. JPanel по умолчанию является непрозрачным, так что вам нужно, чтобы изменить его, чтобы быть прозрачным
  2. JFrame использует BorderLayout по умолчанию, так что только один компонент будет отображается в центральном положении (по умолчанию), в этом случае последнее, что вы добавляете.
  3. Вы должны вызвать setVisible последний

Вместо этого установите менеджер компоновки для JLabel и добавить класс игрока к нему. Вместо добавления JLabel к раме, вы должны сделать наклейку contentPane для кадра, например ...

p1.setOpaque(false); 
JFrame ar = new JFrame(); 
ar.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
JLabel background = new JLabel(new ImageIcon("/Users/rizins/Desktop/PacManTestBackGround.jpg")); 
ar.setTitle("Runner Maze"); 
ar.setContentPane(background); 
ar.setLayout(new BorderLayout()); 
ar.add(p1); 
ar.pack(); 
ar.setVisible(true); 

Я должен отметить, что использование JLabel для отображения фонового изображения, как это может привести к вам проблемы, так как JLabel использует только текст и свойства значков для расчета его предпочтительного размера, это может привести к тому, что некоторые дочерние компоненты будут выложены за пределы видимого диапазона.

См How to set a background picture in JPanel для более подробной информации и возможного решения

+0

Да спасибо это прояснилось некоторые проблемы у меня были на некоторых другие проекты тоже спасибо, что объяснили это так, как вы это сделали! –

+0

Рад, что это может помочь – MadProgrammer

0

Вы можете сделать JPanel прозрачным, установив непрозрачность на false. например:

panel.setOpaque(false) 

Попробуйте, если эта работа для вас.

0

Используйте JLayeredPane и добавьте свой фон в индекс 0 (с индексом Integer не int). Затем вы добавляете еще один JPanel, который не является непрозрачным (как в ответе @Bahramdun Adil), и добавьте к нему своего игрока.

Таким образом, вы можете иметь фон и отображать свой плеер одновременно.

+0

Или просто применить менеджер компоновки к 'JLabel' и добавить (прозрачный) панель к ней – MadProgrammer

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