Mam funkcję ChangeImage, która wygląda tak:
public void ChangeImage(Image img, int x, int y)
funkcja przypisuje obrazek do klasy, przypisuje x i y pojawienia się obrazka i wykonuje repaint() które prawdopodobnie wywołuje funkcję paintComponent().

Sytuacja u mnie w programie wygląda tak:

Main.java

  • w funkcji public static void main tworzy zmienna typu Panel i typu JFrame;

Panel.java

  • w konstruktorze nadaje rozmiary okna tworzy obiekt menu typu Menu, wywołuje metodę menu.MainMenu();
  • funkcja ChangeImage zmienia obrazek do wyswietlenia i wywołuje funkcję repaint()
  • funkcja paintComponent rysuje obrazek (drawImage) zapisany w zmiennej img typu Image

Menu.java

  • konstruktor ładuje do zmiennych klasy wszystkie bitmapy które będą potrzebne w działaniu menu
  • MainMenu() wywoluje panel.ChangeImage dla zmiennej main (menu główne)
  • SubMenu() działa podobnie jak MainMenu() tylko sprawdza parametr i w zależności od parametru wyswietla odpowiedni obrazek i pozniej znowu wywołuwany jest panel.ChangeImage dla obrazka powrotu

i teraz jeśli w metodzie SubMenu zakomentuje wyswietlanie obrazka z napisem powrót to submenu się wyswietli, jeśli natomiast ChangeImage dla obrazka powrótu jest odkomentowane to submenu już się nie pojawia a pojawia się pasek powrotu

Main.java

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;

public class Main {
	final static int WIDTH = 640;
	final static int HEIGHT = 480;
	
	
	public static void main(String[] args) {
		Panel panel = new Panel(WIDTH, HEIGHT);

		JFrame frame = new JFrame();
		frame.getContentPane().add(panel);
		frame.pack();
		frame.setTitle("Gra");
		frame.addWindowListener( new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		frame.setVisible(true);
	}

}

Panel.java

import javax.swing.JPanel;
import java.awt.*;

class Panel extends JPanel {

	public static final long serialVersionUID = 1L;
	int StartX;
	int StartY;
	Image img;
	Menu menu;
	

	public Panel(int width, int height) {
		Dimension size = new Dimension(width, height);
		setPreferredSize(size);
		setMinimumSize(size);
		setMaximumSize(size);
		setSize(size);
		setLayout(null);
		menu = new Menu(this);
		menu.MainMenu();
		addMouseListener(new MenuControl(menu));
	}
	
	public void ChangeImage(Image img, int x, int y) {
		this.img = img;
		this.StartX = x;
		this.StartY = y;
		this.repaint();
	}
	
	public void paintComponent(Graphics g) {
		g.drawImage(img, this.StartX, this.StartY, null);
	}
}

Menu.java

import java.awt.Image;
import javax.swing.ImageIcon;

public class Menu {
	Panel panel;
	Image main;
	Image back;
	Image crew;
	Image blank;
	Image help;
	int sub;
	
	public void MainMenu() {
		this.panel.ChangeImage(this.main, 0, 0);
		this.sub = 0;
	}
	
	public void SubMenu(int x) {
		switch(x) {
			case 3:
			this.panel.ChangeImage(this.crew, 0, 166);
			break;
		
			case 4:
			this.panel.ChangeImage(this.blank, 0, 166);
			break;
			
			case 5:
			this.panel.ChangeImage(this.help, 0, 166);
			break;
		}
		//this.panel.ChangeImage(this.back, 50, 430);
		this.sub = 1;
	}
	
	public int GetSub() {
		return this.sub;
	}
	
	public Menu(Panel panel) {
		this.main = new ImageIcon("menu.jpg").getImage();
		this.back = new ImageIcon("back.jpg").getImage();
		this.crew = new ImageIcon("crew.jpg").getImage();
		this.blank = new ImageIcon("blank.jpg").getImage();
		this.help = new ImageIcon("help.jpg").getImage();
		this.panel = panel;
		this.sub = 0;
	}
}

MenuControl.java

import java.awt.event.*;

public class MenuControl extends MouseAdapter
{
	private int Xm, Ym;
	private Menu menu;
	
	public void mousePressed(MouseEvent e)
	{
		Xm=e.getX();
		Ym=e.getY();
		
		if(Xm<215 && Xm>85 && menu.GetSub()==0) {
			if(Ym<251+30*1 && Ym>251+30*0) {
				// nowa gra
				//System.out.println("Nowa gra");
			} else if(Ym<251+30*2 && Ym>251+30*1) {
				// 2. etap
				//System.out.println("2. etap");
			} else if(Ym<251+30*3 && Ym>251+30*2) {
				// autorzy
				this.menu.SubMenu(3);
				//System.out.println("Autorzy");
			} else if(Ym<251+30*4 && Ym>251+30*3) {
				// wyniki
				this.menu.SubMenu(4);
				//System.out.println("Wyniki");
			} else if(Ym<251+30*5 && Ym>251+30*4) {
				// pomoc
				this.menu.SubMenu(5);
				//System.out.println("Pomoc");
			} else if(Ym<251+30*6 && Ym>251+30*5) {
				// wyjscie
				//System.out.println("Wyjscie");
			}
		} else if(Xm>50 && Xm<139 && Ym>430 && Ym<450 && menu.GetSub() == 1) {
			this.menu.MainMenu();
		}
	}
	
	public MenuControl(Menu menu) {
		this.menu = menu;
	}
}

podsumowując:
efekt jest taki, że na początku obraz menu głównego (MainMenu()) jest rysowany. Po wyborze SubMenu(x) obraz narysowany przez MainMenu() pozostaje i pojawia się tylko jeden obraz "rysowany" przez SubMenu().
Jak zrobić żeby rysowało this.crew i this.back a nie tylko jedno z tych dwóch ?