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 ?