Как на JPanel использовать метод отрисовки объекта из другого класса?

0
28 июл 2018 18:16
Доброго времени суток. Пытаюсь сделать небольшую игру и столкнулся с проблемой рисования объектов.
Вот главный класс.
public class Main {
	public static Frame frame = new Frame();
	public static JPanel[] panels = {new Game(), new Menu()};
			
	public static void main(String[] args) {
		 frame = new Frame();		
		 frame.add(panels[0]);		 
		 frame.add(panels[1]);	
		 
		 if(panels[1].isVisible()) {
			 frame.remove(panels[0]);
			 panels[0].setVisible(false);
		 }
		 if(panels[0].isVisible()) {
			 frame.remove(panels[1]);
			 panels[1].setVisible(false);
			 ((Game) panels[0]).start();
		 }		 
	}
}

Сначала запускается панель меню
public class Menu extends JPanel {		
	public Menu() {		
		JButton btn = new JButton("Start");
		add(btn);
		btn.addActionListener(new ActionListener() {			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				Main.frame.add(Main.panels[0]);
				Main.frame.remove(Main.panels[1]);				
				Main.panels[0].setVisible(true);
			}
		});		
	}	 		 
	public void paintComponent(Graphics g) {
		Graphics2D g2 = (Graphics2D)g;
		g.setColor(Color.BLUE);
		g.fillRect(0, 0, Frame.frameW, Frame.frameH);		
	}
}

При нажатии на кнопку, Frame переключается на игровую панель
public class Game extends JPanel implements Runnable {	
	public static int WIDTH = Frame.frameW, HEIGHT = Frame.frameH;			
	public Thread thread;	
	private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);;
	private Graphics2D g = (Graphics2D) image.getGraphics();	
	public static GameBack background;
	public static Player player;
	
	public Game() {		
		super();
		setPreferredSize(new Dimension(WIDTH, HEIGHT));
		setFocusable(true);
		requestFocus();						
	}	
	public  void start() {
		thread = new Thread(this);
		thread.start();
	}	
	public void run() {						
			background = new GameBack();
			player = new Player();		
		while(true) {										
				gameUpdate();
				gameRender();
				gameDraw();						
			try {
				Thread.sleep(33);
			} catch (InterruptedException e1) {				
				e1.printStackTrace();
			}
			}
			
		}		
	public void gameUpdate() {		
		background.update();
		player.update();					
		}			
	public void gameRender() {		
		background.draw(g);
		player.draw(g);				
	}	
	public void gameDraw() {
		Graphics g2 = this.getGraphics();
		g2.drawImage(image, 0, 0, null);
		g2.dispose();
	}
}

Игровая панель должна отрисовывать фон и игрока, которые прописаны в отдельных классах, но этого почему-то не происходит.
Класс фона. Класс игрока построен по такому же принципу.
public class GameBack {
	private Color color;
		
	public GameBack() {		
		color = Color.BLUE;		
	}	
	public void update() {		
	}	
	public void draw(Graphics2D g) {
		g.setColor(color);
		g.fillRect(0, 0, Game.WIDTH, Game.HEIGHT);		
	}
}

Помогите разобраться почему это не работает. Заранее спасибо
Модераторы: Нет
Сейчас эту тему просматривают: Нет