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 ?